个人学习笔记,也只有自己能看懂。
// 多维数组的指针探究
#include<stdio.h>
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p1)[4]=&a[0];/*尝试过,无法用二级指针变量指向二维数组名,即 int **p1=a,
这么写编译会报错,提示无法编译。必须定义指向定长的一维数组的指针变量才行。*/
printf("%d\n",p1);//第一个第一维元素的地址,即a[0][]的地址。
printf("%d\n",p1+1);//第二个第一维元素的地址,即a[1][]的地址。
//这里1的步长是第一维元素所占存储空间,即4个int,16个字节。
printf("%d\n",*(p1)[0]);//输出a[0][0]的值。C语言不能输出一个数字数组的值。
//p1是指向数组a的第一维元素的地址的指针变量,那么*p1即a的第一个第一维元素。
//加个下标,就可以表示数组a的第二维元素。
//**p1、**(p1+1)这样写法也可以,因为p1是指向特定长度数组的指针变量。
int *p2=&a[0][0];//使指针变量p2指向第一个第二维元素,即a[0][0]。
printf("%d\n",p2);//第一个第二维元素的地址,即a[0][0]的地址
printf("%d\n",p2+1);//第二个第二维元素的地址,即a[0][1]的地址。
//步长是第二维元素所占空间,这里是一个int,即4个字节
printf("%d\n",*p2);//a[0][0]的地址。
printf("%d\n",a);//第一个第一维元素首地址
printf("%d\n",*(a+1));//第二个第一维元素首地址,a+1加的是第一维元素所占的存储空间,
//在这里是4个int,16字节,跟p1一样。这里是a[1][]的首地址
printf("%d\n",**a);//只有对数组名,才能使用**a这种写法,
//可以输出这个数组的第一个最高维元素,这里是a[0][0]
return 0;
}