int aa[6][6] = {0};
int **pp = aa;
int (*pl)[1];
pl = aa;
int a[6] = {0};
int *p = a;
printf( "%d\n", *p );
printf( "%d\n", **pl ); // 正常
printf( "%d\n", **pp ); // 报错
一级指针访问没问题,二级就报错
int aa[6][6] = {0};
int **pp = aa;
int (*pl)[1];
pl = aa;
int a[6] = {0};
int *p = a;
printf( "%d\n", *p );
printf( "%d\n", **pl ); // 正常
printf( "%d\n", **pp ); // 报错
一级指针访问没问题,二级就报错
C 语言里的多维数组,本质上是『数组的数组』。也就是说,aa
本质上是一个一维数组,只不过它的元素也是数组。由于一维数组与指针的关系很暧昧,所以可以认为 aa
存储的是一组 int *
类型的指针。
如果像下面这样声明 pp
,虽然编译器(我用的 gcc)会给出警告,但是后面的打印结果没问题。
int *(*pp)[] = aa;
这个声明的意思是,pp
是指向数组的指针,而这个数组里的元素都是 int *
类型的指针。
6 回答6.8k 阅读✓ 已解决
1 回答3.3k 阅读
1.1k 阅读
这段代码是无法clean compile的。
int **pp = aa
会warning。因为**p
和aa
是不兼容的类型。这个会把
aa
数组的起始地址付给p
。但是这个地址存放的值是0。然后0这个地址会被访问**pp
。就会出现segmentfault.