C语言指针一向较难,上学期遇见这两个名词更是一脸懵逼,一直说写博客老忘记,今天补上。
指针数组
首先它是一个数组,只不过数组中元素数据结构为指针类型,这个比较好理解
声明方式为 * p[ ]; 这个比较好记,[ ]优先级比 * 高,所以先是数组再是指针,所以是指针数组(好勉强的解释,不过很好记,如果要用的话,先写出来会更好理解)
#include<stdio.h>
int main()
{
int *p[2]; //定义指针数组
int a[2][3] = {{1,2,3},{4,5,6}}; //定义一个二维数组
p[0]=a[0]; //将二维数组中第一行首地址赋给指针数组中元素 p[0]
p[1]=a[1]; //将中第二行首地址赋给指针数组中元素 p[1]
printf("%d\n",*p[0]); //输出p[0]地址所指向的值
printf("%d\n",*p[1]); //输出p[1]地址所指向的值
return 0;
}
结果
p[0]=a[0];
p[1]=a[1];
a[0]和a[1]分别是指向两个一维数组的指针,也就是说p[2]这个指针数组存的是两个一维数组的首地址,并且也代表了两个一位数组,只不过a[0]和a[1]真正的值是a[0][0]和a[1][0]的地址,所以输出就是两个一维数组的第一个元素
数组指针
和上面一样,首先它是一个指针,只不过是指向一个数组的指针,声明方式为(*p)[ ];这个也好记,括号优先级虽然和[ ]相同,但结合方向是由左向右的,所以先是(*p)说明是一个指针,然后是[ ]表示为一个数组,所以是数组指针
#include<stdio.h>
int main()
{
int (*p)[3]; //定义数组指针
int a[2][3] = {{1,2,3},{4,5,6}}; //定义一个二维数组
p=a; //a指向的是a[0][3]这个一维数组,将a赋给p
printf("%d\n",**p); //输出p指向二维数组第一行的第一个值
printf("%d\n",**(p+1)); //输出p指向二维数组第二行第一个值
return 0;
}
结果
这里的赋值和取值理解同上,完全与指针数组赋值语句的理解相同,只不过上面的解释更适用于这里,更易理解。