【问题标题】:Difference between address using array_name V.s &array_name?使用 array_name 与 &array_name 的地址之间的区别?
【发布时间】:2021-03-18 04:10:03
【问题描述】:

所以我正在研究数组和指向数组的指针,我发现了这段代码。 我想知道为什么最后一个的地址是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
}

【问题讨论】:

  • 附带说明,在使用 %p 格式说明符打印它们之前,将指针转换为类型 void *。另外,arr&amp;arr[0] 是一回事。

标签: arrays c pointers memory-address


【解决方案1】:

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

对于arrarr+1,指针的数据类型是int,在您的系统上是4 个字节,因此您会看到FE00FE04 之间的4 个字节差异。

对于&amp;arr&amp;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,您会发现 &amp;arr&amp;arr+1 之间的差异更大。

【讨论】:

  • 感谢您的回答,我不知道 &arr 将是 20 个字节。
【解决方案2】:
printf("%p\n", arr+1);

在这段代码中,arr 是一个整数指针,所以arr + 1 的结果是 arr + 1 * sizeof(int),即 4。

printf("%p\n",&arr+1);

在这一个中,&amp;arr 是一个指向 5 个int 的数组的指针,所以&amp;arr + 1 的结果是&amp;arr + 1 * sizeof(int[5]),即 20(十六进制的 14)

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2019-07-04
    • 1970-01-01
    • 2015-07-23
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多