[英]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 时,它打印的值相同。 为什么会这样?
arr
是int
的 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.