c - 在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
。根据数组到指针的转换规则,arr
inprintf(“%p\n”, arr);
将衰减为指向其第一个元素的指针。array 的第一个元素arr
是 type int [5]
,即 5 的数组int
。因此,它将打印数组的第一个元素的arr
地址(地址arr[0]
)。
取消引用,arr
将返回 的第一个元素arr
。第一个元素的类型int [5]
如前所述。所以*arr
将返回一个 5 的数组,int
但再次根据数组到指针的转换规则*arr
将衰减到指向它的第一个元素的指针,即arr[0][0]
.
所以,实际上首先printf
是打印数组的地址,arr[0]
然后是打印元素的地址arr[0][0]
。
要了解为什么这两个地址相同,我建议您阅读这篇文章。
推荐阅读
- java - spring 应用程序 - 获取 RequestMapping
- javascript - VueJS - 在 v-for 循环中调用方法,得到错误“未在实例上定义但在渲染期间引用”
- python - 在 Python 的字典中创建/附加嵌套字典?
- javascript - Electron 在 OSX 上是否有“工具栏”窗口类型?
- symfony - Stylelint 输出不显示出现警告的文件的名称
- node.js - MongoDB 不返回数据 MEAN Stack App
- c++ - 如何包装一个函数以适应另一个函数的所需类型
- c - 如何读入c中正在运行的进程?
- amazon-web-services - FileNotFoundException: 没有这样的文件或目录 's3
- android - 无法从包 androidx.camera.core 导入 PreviewConfig 类