Mar*_*ton 15 c c++ arrays pointers
我的代码如下:
main() {
int array[5] = {3,6,9,-8,1};
printf("the size of the array is %d\n", sizeof(array));
printf("the address of array is %p\n", array);
printf("the address of array is %p\n", &array);
int * x = array;
printf("the address of x is %p\n", x);
printf("the size of x is %d\n", sizeof(x));
}
Run Code Online (Sandbox Code Playgroud)
输出是
the size of the array is 20
the address of array is 0x7fff02309560
the address of array is 0x7fff02309560
the address of x is 0x7fff02309560
the size of x is 8
Run Code Online (Sandbox Code Playgroud)
我知道变量array将被视为指向数组第一个元素的指针,所以我理解x的大小是8.但是我不知道为什么数组的大小是20.不是应该是8(64位机器)?
除了程序如何知道它是20?据我所知,它不存储元素的数量.怎么来sizeof(array)和sizeof(x)不同?我跟踪了几个与阵列衰减相关的帖子,但对这个问题一无所知.
Jer*_*fin 16
在大多数情况下,数组的名称衰减为指向数组第一个元素的指针.但是,该规则有几个例外.最重要的两个是数组名称用作sizeof运算符或address-of运算符(&)的操作数.在这些情况下,数组的名称仍然是整个数组的标识符.
对于非VLA数组,这意味着可以静态地确定数组的大小(在编译时),并且表达式的结果将是数组的大小(以字节为单位),而不是指针的大小.
当您获取数组的地址时,您将获得相同的值(即,相同的地址),就像您刚刚使用数组的名称而不使用地址一样.但是类型是不同的 - 当你明确地获取地址时,你得到的是一个类型为"指向N个T类型数组的指针"的指针.这意味着(例如)虽然array+1指向数组的第二个元素,但是&array+1指向刚好超过整个数组末尾的另一个数组.
假设至少有两个项的数组,*(array+1)将引用数组的第二个元素.无论数组大小如何,&array+1都会产生一个超过数组末尾的地址,因此尝试取消引用该地址会产生未定义的行为.
在你的情况,因为该阵列的尺寸是20,并且阵列中的一个元件的尺寸是4,如果array是,比方说,为0x1000,那么array+1将是0x1004和&array+1将是0x1014(0×14 = 20).
小智 14
您的数组具有静态长度,因此可以在编译时确定.你的编译器知道sizeof(int) = 4你的静态数组长度[5].4*5 = 20
编辑:您的编译器int可能是32位,但是寻址64位.这就是为什么sizeof(pointer)返回8.
请注意,sizeof是不是库函数.sizeof 是
编译时一元运算符[...],可用于计算任何对象
K&R 的大小
所以sizeof不知道数组有多大,编译器知道数组的大小,以及定义
应用于数组时,结果是数组中的总字节数.
K&R
指针和数组是2种不同的数据类型.
数组可以包含类似数据类型的元素.数组的内存是连续的.
指针用于指向某个有效的内存位置.
sizeof(type) 为您提供所传递类型的字节数.
现在,如果你传递数组,那么编译器知道这是一个数组和元素的数量,它只是将那么多元素与相应的数据类型大小值相乘.
在这种情况下:
5*4 = 20
Run Code Online (Sandbox Code Playgroud)
同样是sizeof(int)或sizeof(pointer)依赖于平台.在这种情况下,你看到sizeof(pointer)8.