今天偶尔帮别人做C语言题,突然 想写一篇C语言的数组指针,指针数组还有二维数组用指针表示,以后自己忘了就可以直接看博客了。
数组指针:是一个指针,指向一个数组
int a[5]={1,3,5,7,9};
int *p=a;
int (*num)[5]=a; //数组指针
printf("%d\n",*num); //*num为数组a的首地址
printf("%d\n",**num); //**num为a[0]的值,等价于*(*num+0)
printf("%d\n",*(*num+1)); //*(*num+1)为a[1]的值
运行结果为1638188(数组a的地址) 1 3
指针数组:是一个数组,数组每个元素是指针类型的,也就是存的是地址
int a[5]={1,3,5,7,9};
int *num1[5]={&a[0],&a[1],&a[2],&a[3],&a[4]}; //指针数组
int **p=num1; //p为num1即数组num1的首地址,*p为num1[0],即&a[0],**p为a[0]
printf("%d\n",num1[0]); //num1[0]为&a[0],即a[0]的地址
printf("%d\n",*num1[0]); //*num1[0]等价于a[0]
printf("%d\n",*(*p+2));
//*(*p+2)等价于 a[2]
运行结果是:1638188(a[0]的地址) 1 5
二维数组:有行,有列,存储类似于矩阵
int b[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
printf("%d\n",**(b+2)); //b+2是&b[2],b[2]={11,12,13,14,15},*(b+2)是&b[2][0],**(b+2)是b[2][0]
printf("%d\n",*(*(b+2)+2)); //*(b+2)是&b[2][0],+2是&b[2][2],*(*(b+2)+2)是b[2][2]
printf("%d\n",b[0]+2); //b[0]+2是&b[0][2]
printf("%d\n",b+2); //b+2是&b[2]
printf("%d\n",*(b+2)); //*(b+2)是&b[2][0]
运行结果是 11 13 1638136 1638168 1638168
int b[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
int *q=b; //q是地址,*q是值,二维数组的存储也可以看成是多个一维数组
printf("%d\n",q+13); //q+13就是&b[2][3]
printf("%d\n",*(q+13)); //*(q+13)就是b[2][3]
运行结果是 1638180(b[2][3]的地址 14
这些都是些基础的,大家下去可以继续探索指针与数组的知识
by WYZ