1

示例代码:

#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

4 回答 4

1

数组大小表示数组的总大小,在这种情况下是 5 个整数。但是指向数组的指针实际上存储了一个内存地址,其大小取决于您使用的系统。所以他们是不同的

于 2013-07-16T05:41:39.520 回答
1

是否分配了良好的实践?

是的,例如,如果您将数组传递给函数,它将衰减为指针。假设您需要保留原始指针,但还需要另一个指针来遍历数组。您声明一个指向同一地址的单独指针并使用它来迭代它。

当我们分配时,哪些事情会发生变化?

指针指向一个地址,就是这样(以前它可能指向另一个地址或NULL),受让人(在你的情况下是数组)没有被修改。数组和指针之间有很大的区别,这就是为什么你会得到不同的结果。指针和数组只是表面上是等价的。

您仍然可以使用指针来访问和修改数组的内容,但两者并不相同(如 的结果所示sizeof)。

为什么是 8?

在 32 位机器上,指针通常为 4 字节大,在 64 上为 8。如果采用本地数组的大小,sizeof则将数组中的元素数乘以每个元素的大小。五个整数,每四个字节大等于 20。

于 2013-07-16T05:41:46.090 回答
0

sizeof(arr)在您的情况下给出的数组大小为 20 字节。当您执行p = arr;它实际上是将第一个数组元素(&arr[0])的地址分配给整数指针p。所以现在 sizeof(p) 仅给出整数指针的大小。

记住数组和指针是不一样的。数组名称是它的第一个元素的地址。数组可能会衰减为指针。

于 2013-07-16T05:37:59.480 回答
0

为什么是 8?

sizeof运算符给出statically定义数组的总字节大小,而对于指针,它给出的pointer大小对于 64 位系统可以是 8 个字节,对于 32 位系统可以是 4 个字节。

是否分配了良好的实践?

是的,因为在 C 中您没有太多选择,但更好的方法是在 C++中使用引用。

当我们分配时,哪些事情会发生变化?

没有任何变化,原始数据被保留。

于 2013-07-16T05:36:59.333 回答