arrays - 使用 array_name 和 &array_name 的地址之间的区别?

标签 arrays c pointers memory-address

所以我正在研究数组和指向数组的指针,我发现了这段代码。 我想知道为什么最后一个地址是FE14,它不是应该是第一个元素的地址加上(数据类型的大小)4,所以我应该是FE04?

#include <stdio.h>
int main()
{
    int arr[5];
    printf("%p\n",arr); //----> the output FE00
    printf("%p\n",arr+1); //----> the output FE04
    printf("%p\n",&arr); //----> the output FE00
    printf("%p\n",&arr+1); //----> the output FE14
}

最佳答案

这很令人困惑,因为 C 数组可以退化为指针表达式。

对于arrarr+1,指针的数据类型是int,在你的系统上是4个字节,这就是为什么您会看到 FE00FE04 之间存在 4 个字节的差异。

对于&arr&arr+1,指针的数据类型是int[5],即20个字节,因此为什么您会看到 FE00FE14

之间有 20 个字节的差异

相差0x14,即:

  1 * 16^1 + 4 * 16^0
= 1 * 16   + 4 * 1
= 16       + 4
= 20

如果将 int arr[5] 的大小从 5 个整数长度更改为 500,您会发现 &arr&arr+1.

关于arrays - 使用 array_name 和 &array_name 的地址之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65171803/

相关文章:

搜索 ArrayList 时发生 Java JSON ClassCastException

c++ - 在哪里可以找到 AIX 的静态 Xerces 3.0.0 库

c - 类型转换 void 指针并分配内存

arrays - Excel 2007 VBA 数组大小限制

javascript - 单击加载不同的 api 内容(JS)

ios - 如果从外部调用,NSMutableArray 为空?

c - 根据概率选择随机项目

在C中为字符串剪切字符

pointers - 修改取消引用的结构指针会更改大多数结构值,但不会更改 slice

objective-c - 将对象传递给未分配的指针