当数组分配给指针时,sizeof运算符返回不同的值。为什么?

时间:2013-07-16 05:34:10

标签: c sizeof

示例代码:

#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正在返回不同的值。

所以我在这里几乎没有问题:

  • 是否指定了良好做法?
  • 分配时会发生什么变化?
  • 为什么8?

4 个答案:

答案 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是其第一个元素的地址。数组可能会衰减为指针。