sizeof运算符计算数组问题

pp25210 2011-04-17 10:39:36

#include<stdio.h>
void main()
{
int a[100]={11,78};
printf("sizeof(&a)=%d\n",sizeof(&a));
printf("sizeof(a)=%d\n",sizeof(a));
}

a 是一个包含100个 int 数据的数组,sizeof(a)=400; &a 是 a 的地址值,sizeof(&a) 为什么不是 4 而是400 ?
...全文
120 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pp25210 2011-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 c_losed 的回复:]

英雄 sizeof(&a)是4.。。
vs08执行结果
[/Quote]
忘了说了,400是在vc 6.0下的结果,我刚刚在 VS2010下运行了,结果如 VS08 是4
hhg0719 2011-04-17
  • 打赏
  • 举报
回复
sizeof(a)返回数组a在内存中所占的空间大小,以字节为单位, 也就是sizeof(a) = sizeof(int) * 100 = 4 * 100 = 400bytes

sizeof(&a)= sizeof(int), int类型在32位机器中的大小是4个字节, 所以sizeof(&a) = 4
pamtry 2011-04-17
  • 打赏
  • 举报
回复
数值一样,但是意义不同,详细请看我6L的解释

[Quote=引用 9 楼 wongys 的回复:]

a=&a=&a[0],这三者是一样的
[/Quote]
wongys 2011-04-17
  • 打赏
  • 举报
回复
a=&a=&a[0],这三者是一样的
pamtry 2011-04-17
  • 打赏
  • 举报
回复
关于sizeof()对数组指针取地址的解读,我觉得与其说是编译器差异,不如说是vc6.0对于c标准的支持比较差罢了
书虫 2011-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 c_losed 的回复:]
英雄 sizeof(&a)是4.。。
vs08执行结果
[/Quote]

同,第一个结果是4,第二个时400
pamtry 2011-04-17
  • 打赏
  • 举报
回复
首先,数组名不是指针,而是一个数值上等于指向数组首地址指针的常量
不过C中允许使用&a,其值和a是等同的,即 a=&a
但是,两者的意义确实是有微妙的差别

a代表的是数组的首地址,其包含的深一层的含义其实就是&a[0],所以,a+1 = &a[1]

而&a代表的是一个指向整个数组的指针(注意,数值上等于,实际不是指针),所以,&a+1指向的是“下一个a[]数组的首地址了”(类比 int *p[10]),比如lz这个例子中,&a+1 == a+10

关于sizeof,因为其不是一个函数,而是c语言内置的一个运算符,会在编译前进行运算并且直接进行替代。
VS2010下,对于sizeof(&a)的解读已经变成了4,这说明数组取地址后,其属性将从数组指针蜕变为一个普通指针,这个指针指向的类型为数组罢了
firefoxbug 2011-04-17
  • 打赏
  • 举报
回复
在VS2008上面是 4,在VC上面是400,在codeblock上面测试出来是4,这是编译器解释的不同而已,建议楼主不要太专牛角尖。
handoudouhao 2011-04-17
  • 打赏
  • 举报
回复
数组名a本身不就是一个常量吗,一个地址常量,能使用&运算符吗?
C_ROOKIES 2011-04-17
  • 打赏
  • 举报
回复
这个我晓得,&a是地址,现在的系统一般都是32位的。所以你的地址要表示那么多的地址标号,就得用4个字节32位数据来表示4G的内存数量。所以你的&a内存数据是4个字节的。这个就是有点绕,你自己慢慢理解下。
ckmoonfish 2011-04-17
  • 打赏
  • 举报
回复
数组名是指向整个数组的指针。&a 意思是取整个数组。
c_losed 2011-04-17
  • 打赏
  • 举报
回复
英雄 sizeof(&a)是4.。。
vs08执行结果

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧