繁体   English   中英

打印C中二维数组第一个元素的地址

[英]Printing the address of the first element of 2D array in C

#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 时,它打印的值相同。 为什么会这样?

arrint的 arrays 的数组。 按照数组到指针的转换规则, arr in printf(“%p\n”, 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]的地址。

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

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

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

在第二个示例中,您显式处理了第一个维度的第一个元素(其类型为int[5] - 5 个元素的int数组),并且该元素还衰减为指向其第一个元素的指针,该指针再次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 的指针。指针的值以实现定义的方式转换为打印字符序列。”

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

 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);
```````````````

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM