在调试程序的时候发一个关于关键字sizeof的令我感到困惑的问题
看下面的例子:
int a[5]
所有人都明白这里定义了一个数组,其包含了5 个int 型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素。
当我们定义一个数组a 时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a。名字a 一旦
与这块内存匹配就不能被改变。a[0],a[1]等为a 的元素,但并非元素的名字。数组的每一个元素都是没有名字的。那现在再来看看sizeof 关键字时的几个问题:
sizeof(a)的值为sizeof(int)*5,32 位系统下为20。
sizeof(a[0])的值为sizeof(int),32 位系统下为4。
sizeof(a[5])的值在32 位系统下为4,此处并不会出错。关键字sizeof 求值是在编译的时候。虽然并不存在a[5]这个元素,但是这里也并没有去真正访问a[5],而是仅仅根据数组元素的类型来确定其值。所以这里使用a[5]并不会出错。
sizeof(a)取5个元素的大小,在32位系统下为20,这个好理解,所有元素的sizeof值
sizeof(&a[0])的值在32位系统下是4,这个也好理解,首元素a[0]的首地址.
但是sizeof(&a) 在32位系统下VC++6.0的结果为20,这个令我非常难以理解,&a不是数组a的首地址么?&a既然是取a 的首址那不是应该为4才对吗?如果我的观点是正确的,那么是不是编译器出错了?如果我的观点的是错误的,那么&a就不是取首地址了?非常矛盾!
希望高人指点。