【问题标题】:Printing the address of the first element of 2D array in C在C中打印二维数组的第一个元素的地址
【发布时间】:2020-07-18 04:57:33
【问题描述】:
#include <stdio.h>

int main ()  
{
    int  arr[4][5] = {{1, 2, 3, 4, 5},
                      {6, 7,8, 9, 10},
                      {11, 12, 13, 14, 15},
                      {16, 17,18, 19, 20}
                     };
    printf("%p\n", arr);
    printf("%p\n",*arr);

    return(0);
}

我的疑问是,当我打印 arr 和 *arr 时,它打印的值相同。为什么会这样?

【问题讨论】:

  • 你能再检查一下吗,我已经更新了。

标签: c pointers memory multidimensional-array printf


【解决方案1】:

arrint 的数组。根据数组到指针的转换规则,printf(“%p\n”, arr); 中的arr 将衰减为指向其第一个元素的指针。数组arr 的第一个元素是int [5] 类型,即5 个int 的数组。因此,它将打印数组arr 的第一个元素的地址(arr[0] 的地址)。

取消引用,arr 将返回arr 的第一个元素。如前所述,第一个元素的类型为int [5]。所以*arr 将返回一个由 5 个数组组成的数组 int 但再次按照数组到指针的转换规则 *arr 将衰减到指向它的第一个元素的指针 arr[0][0]

所以,实际上首先printf 打印数组arr[0] 的地址,而稍后打印元素arr[0][0] 的地址。

要了解为什么这两个地址相同,我建议您阅读此post

【讨论】:

  • 伙计,你太棒了,你的评论清除了我所有的疑问..!!!!!感谢您的回答。 :)
【解决方案2】:
printf("%p\n", arr);
printf("%p\n",*arr);

在第一个示例中,arr 衰减为指向二维数组arr 的第一维中第一个元素的指针(第一个int 5 个元素的数组 - 类型 (int[5]))它也衰减为指向其第一个元素的指针,即a[0][0]

在第二个示例中,您显式处理第一个维度的第一个元素(类型为 int[5] - int 5 个元素的数组),并且该元素还衰减为指向其第一个元素的指针,这又是a[0][0]

所以两者的结果完全相同 - 访问并打印第一个数组的第一个元素的地址arr - arr[0][0] 的第一个维度。


请注意,您需要将指针转换为 void,以使程序符合 C 标准,因为标准意味着 %p 格式说明符需要具有 void* 类型的关联参数:

printf("%p\n", (void*) arr);
printf("%p\n", (void*) *arr);

引自 ISO:IEC 9899:2018 (C18),第 7.21.6.1/8 节:

“p - 参数应为指向 void 的指针。指针的值以实现定义的方式转换为打印字符序列。”

【讨论】:

  • 为什么我的意思是他们有相同的地址?你能分享一下我可以深入研究的地方吗?
  • 例如here你可以找到一些信息。基本上,数组是一个常量指针,每次访问它时都会自动取消引用。
  • @SanjayVerma 数组arr´ decays to a pointer to the first elemet of array arr`。第一个元素始终具有相同的地址,无论您是显式寻址还是通过数组寻址到指针衰减都无关紧要。
  • @RobertSsupportsMonicaCellio; arr*arr 没有给出相同元素的地址。虽然地址相同,但都给出了不同对象的地址。您的回答具有误导性。
  • @hacks 嗯,我稍微编辑了我的答案。您的意思是 arr[0] 地址与 a[0][0] 是不同的对象? - 我认为它是同一个对象,即使它的表示不同。您是否从标准中得到任何参考?
【解决方案3】:

因为你应该知道任何数组的名称都意味着这个数组的第一个地址

 int arr[4]; 
printf("%p",arr);// the same as printf("%p",&arr[0]); 

对于二维数组,数组的名称也充当视觉指针,指向数组中第一个元素的地址

int arr[4][5]; 
printf("%p",&arr[0][0]);//the same as printf("%p",arr);=printf("%p"*arr);
```````````````

【讨论】:

    猜你喜欢
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2014-02-25
    • 2014-04-19
    • 2013-03-03
    • 2011-10-31
    相关资源
    最近更新 更多