例如:
int main(){
int B[2][3] = {{2,3,6}
{4,5,8}};
int (*p)[3];
p = B;
}
此处将二维数组B看做两个一维数组的集合,对于每个一维数组都有3个元素,所以用(*p)[3]来指向整个一维数组。若此时对其进行输出:
printf("%d", B); // 指向整个二维数组的地址即第一个一维数组地址,输出B[0][0]的地址
printf("%d", &B[0]); // 指向第一个一维数组的地址,输出B[0][0]的地址
printf("%d", *B); // 指向第一个一维数组的地址,输出B[0][0]的地址
printf("%d", B[0]); // 指向第一个一维数组的地址,输出B[0][0]的地址
printf("%d", &B[0][0]); // 指向第一个一维数组的第一个元素的地址,输出B[0][0]的地址
printf("%d", B + 1); // 指向第二个一维数组的地址,即第二个一维数组的第一个元素的地址,输出B[1][0]的地址
printf("%d", &B[1]); // 指向第二个一维数组的地址,即第二个一维数组的第一个元素的地址,输出B[1][0]的地址
printf("%d", *(B + 1)); // 指向第二个一维数组,即第二个一维数组的第一个元素的地址,输出B[1][0]的地址
printf("%d", B[1]); // 指向第二个一维数组,即第二个一维数组的第一个元素的地址,输出B[1][0]的地址
printf("%d", &B[1][0]); // 指向第二个一维数组的第一个元素的地址,输出B[1][0]的地址
printf("%d", *(B + 1) + 2);// 指向第二个一维数组的第三个元素的地址,输出B[1][2]的地址
printf("%d", B[1] + 2); // 指向第二个一维数组的第三个元素的地址,输出B[1][2]的地址
printf("%d", &B[1] + 2); // 指向第二个一维数组的第三个元素的地址,输出B[1][2]的地址
对上述情况进行解引用,可获得对应地址的值。
如何解读指针和二维数组,例如:*(*B+1),首先解读*B,为一个指向二维数组的指针,即第一个一维数组,对其+1,则为第一个一维数组的第二个元素,再对其进行解引用,即可输出第一个一维数组的第二个元素的值,即B[0][1]的值。
总结:
B[i][j] = *(B[i] + j)
= *((*B + i) + j)