首页 > 解决方案 > 在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 时,它打印的值相同。为什么会这样?

标签: cpointersmemorymultidimensional-arrayprintf

解决方案


arr是 的数组的数组int。根据数组到指针的转换规则,arrinprintf(“%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]

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


推荐阅读