指向C多维数组的指针的地址

Mam*_*rot 3 c arrays pointers dereference

以下代码提问:

#include <stdio.h>

int main(int argc,char *arg[]){

    if (argc>2){
      int m=atoi(arg[1]);
      int n=atoi(arg[2]);

      int a[m][n];
      int (*p)[m][n]=&a;

      printf("p : %p, *p : %p, **p : %p\n",p,*p,**p);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

主要环境:gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)x86-64

gcc main.c
./a.out 2 4
Run Code Online (Sandbox Code Playgroud)

输出:

p : 0xbfea7ef0, *p : 0xbfea7ef0, **p : 0xbfea7ef0
Run Code Online (Sandbox Code Playgroud)

问题是为什么p == *p == **p.我认为这可能是因为a是一个数组,一种常量指针,其地址是特定的,这涉及gcc的一些实现细节.

nne*_*neo 6

p是指向具有维度的数组的指针[m][n].该指针的值是地址a,因此打印p将获得地址a.

*p是一个维度的数组[m][n].作为指针的"值"是指向数组的第一个元素的指针,即a[0].这是同一个地址a.

**p是一个维度的数组[n].该指针的值是指向数组的第一个元素的指针,即a[0][0].这又是一个地址a.