| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 720 人关注过本帖
标题:C语言萌新,关于数组的问题想请教一下
只看楼主 加入收藏
zh0u
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2023-4-13
收藏
 问题点数:0 回复次数:3 
C语言萌新,关于数组的问题想请教一下
定义了一个整型数组arr
int arr[] = {1,2,3,4,5};
sizeof(arr); // 4 * 5B
printf("%p", arr); // 对应第一个元素 1 的内存地址
printf("%p", arr + 1); // 对应第二个元素 2 的内存地址
所以为什么 arr + 1 的地址是第二个元素的内存地址呢?
而在定义arr的这个作用域内使用sizeof是能正常获取arr的长度,假设作为参数传给某个函数形参接收时,sizeof(形参)得到的又是指针的大小,不太能理解
搜索更多相关主题的帖子: sizeof 数组 元素 地址 C语言 
2023-04-13 08:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
你是不是看漏了&号,导致你把 &arr 和 arr 混淆了?

int a;
sizeof(a); // 4bytes (当然不一定是4字节,但这与本话题无关)
printf("%p",&a); // 对应a的地址
printf("%p",&a + 1); // 对应a下一个变量的地址(a下一个变量 可以不存在,但取其地址是良好定义行为,而对 a下一个变量的下一个变量 取值则是未定义行为,即 &a+2 属于未定义行为,当然这与本话题无关)

仿造上面的代码,你应该写出
int arr[] = {1,2,3,4,5};
sizeof(arr); // 4 * 5B
printf("%p", &arr);
printf("%p", &arr + 1);
亦即,你提供的证据 与 你的疑问 不构成联系。

而 printf("%p", arr); printf("%p", arr + 1) 之所以合法则是因为C语言规定「数组可以隐式地转化成指针」
亦即 printf("%p", arr); 等同于 printf("%p", &arr[0] );
printf("%p", arr+1); 等同于 printf("%p", &arr[0] + 1 );

假设作为参数传给某个函数形参接收时,sizeof(形参)得到的又是指针的大小,
因为数组不可拷贝,即
int a[3] = { 0, 1, 2 };
int b[3] = a; 是不合法的!
对于函数 void foo( int a[3] ) 而言,你怎么传参数给它?
所以这是C语言规定「数组可以隐式地转化成指针」的原因,亦即void foo( int a[3] ) 等同于 void foo( int a[4] ) 等同于 void foo( int* a ) 等同于 ……,本质上都是 void foo( int* a )
2023-04-13 10:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
C语言标准中其实直接规定的是 *(a+i) 等同于 a[i]
2023-04-13 10:35
zh0u
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2023-4-13
收藏
得分:0 
回复 2楼 rjsp
明白了,谢谢!
2023-04-13 13:47
快速回复:C语言萌新,关于数组的问题想请教一下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028218 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved