示例代码:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int arr[5] = {10,20,30,40,50};
int *p;
p = arr;
printf("Total size calculating from array = %ld\n", sizeof(arr));
printf("Total size calculating from pointer = %ld \n",sizeof(p));
return 0;
}
输出
Total size calculating from array = 20
Total size calculating from pointer = 8
到目前为止,我的理解是您可以将数组的地址分配给相同数据类型的指针,并对其执行所有操作而不会出现任何问题。但sizeof
正在返回不同的值。
所以我在这里几乎没有问题:
答案 0 :(得分:1)
数组大小表示数组的总大小,在本例中为5个整数。但是指向数组的指针实际上存储了一个内存地址,其大小取决于您使用的系统。所以他们是不同的
答案 1 :(得分:1)
是否指定了良好做法?
是的,例如,如果将数组传递给函数,它将衰减为指针。假设您需要保留原始指针,但您还需要另一个迭代数组。您声明一个指向同一地址的单独指针,并使用它来迭代它。
分配时会发生什么变化?
指针指向一个地址,就是它(以前它可能指向另一个地址或NULL),受理人(在你的情况下是数组)没有被修改。数组和指针之间有很大的区别,这就是为什么你得到不同的结果。指针和数组似乎只是等价的。
您仍然可以使用指针来访问和修改数组的内容,但两者并不相同(如sizeof
的结果所示)。
为什么8?
在32位机器上,指针通常是4字节大,在64位是8。如果你取一个局部数组的大小,sizeof
会将数组中元素的数量乘以每个数据的大小。元素是。每四个字节大五个整数等于20。
答案 2 :(得分:0)
为什么8?
sizeof
运算符为statically
定义的数组提供总字节大小,而对于指针,它给出pointer
大小,对于64位系统可以是8个字节,对于32位系统可以是4个字节。< / p>
是否指定了良好做法?
是的,因为在C语言中你没有太多选择,但更好的方法是在C ++中使用references。
分配时会发生什么变化?
没有任何变化,原始数据会被保留。
答案 3 :(得分:0)
sizeof(arr)
给出的数组大小为20字节。当你执行p = arr;
时,它实际上是将第一个数组元素(&amp; arr [0])的地址赋给整数指针{ {1}}。所以现在sizeof(p)只给出了整数指针的大小。
记住数组和指针不相同.Array name是其第一个元素的地址。数组可能会衰减为指针。