二级指针:
int a[SIZE][SIZE];int **p = a;
这样是不行的
但是可以这样:
int**p = (int**)malloc(sizeof(int*)*SIZE);
for (int i = 0; i < SIZE; i++) {
p[i] = (int*)malloc(sizeof(int)*SIZE);
}
然后就可以这么用了 p[i][j]。
想要指向二维数组,必须定义一个指向一维数组的指针int (*p)[SIZE] = a; 这样才能赋值。通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上。之后就可以通过二维指针直接访问了。
参考代码如下,可以看具体注释辅助理解。
二维数组:
正确的二维数组的指针应该是:int a[2][2]等于int (*p)[2];//定义时无论数组维数,只可忽略第一维
int **p=(int**)a;//强制将二维数组指针转为指向指针的指针,则此时p[0]=0;p[1]=1;p[2]=2;p[3]=3; //这里也是碰巧了, 指针和int都是4字节,恰巧每次移动到了对应值得位置;如果换成别的类型,或者64位设备就不会这么巧了;
而p[0][0]=*(*(p+0)+0)=**p,p[0][1]=*(*(p+0)+1);