1.指针数组(储存指针的数组)
优先级
“[]”的优先级比“*”的高,[]的优先级为1,*的优先级为2。且优先级:()>[]>*
指针数组的声明
数据类型 *变量名[size];
int *p[10];
因为优先级的关系,p先跟[]结合,说明p是一个数组,然后p再跟*结合。即说明数组p中的元素是指向整型数据的一个指针。
相当于定义了10个指向整型变量的指针。在此,p的数组元素为指针的数组,本质上是数组。
指针数组的变量名相当于一个二级指针。
示例如下:
//例一
int *p[10];
int a = 0, a1 = 0, a2 = 0;
p[0] = &a;
p[1] = &a1;
p[2] = &a2;
*(p[0]) = 1;
*(p[1]) = 2;
*(p[2]) = 3;
printf("%d %d %d\n", a, a1, a2);// 1 2 3
//例二
int *p1[10];
for (int i = 0; i < 10; i++)
{
p1[i] = malloc(4);
printf("%d\n", p1[i]);//输出指针数组中存储的信息
*(p1[i]) = i + 1;
printf("%d\n", *p1[i]);//输出指针数组中存储的地址指向的整型数据
}
int **p2 = p1;
printf("%d\n", *(*(p2 + 5)));//输出指针数组中第6个元素存储的地址指向的整型数据
2.数组指针(指向数组的指针)
数组指针的声明
数据类型 (*变量名)[size];
int (*p)[10];
因为优先级的关系,p先跟*结合,说明p是一个指针,然后再跟[]结合。即说明指针p指向的是一个有10个整形元素的数组。
相当于变量名p就是指向数组首元素的指针,本质上是指针。
在c语言中经常用来指向一个二维数组。
示例如下:
int(*p3)[10];//只是定义,并未占用内存空间
int a[12][12];
p3 = a;
(*(p3+1))[5] = 5;
//p3[1][5] = 5;
printf("%d\n", (*(p3+1))[5]);//5
加深印象:
图片来源:jack_Meng - 博客园 (cnblogs.com)