1. 指针数组
- 含义:指针类型的数组。就是一个数组,每个元素都是指针类型。
定义:
int *p[3]; //定义
int a[3]={0}; //正常的数组
for (int i = 0;i < 3;i++)
{
p[i] = &a[i]; //给每个指针赋值 ---> 也可以 *p[i] = a[i]
}
作用:可以直接定义很多个指针以供使用
2. 数组指针
- 含义:数组类型的指针。就是一个指针,要指向一整个数组,而这个指针就代表这一整个数组。
定义:
//表明:定义了一个 int (*)[5] 类型的指针 ---> 有五个元素的一维数组
int (*p)[5];
//定义数组
int arr1[5];
int arr2[3];
//由于定义的指针数组是指向 --- > 有五个元素的一维数组
//因此,该指针只能指向 有五个元素的一维数组
p = &arr1; //不能指向 arr2
//验证p指向的是整个数组,而不是数组中的一个元素
//原理:当类型不同时,指针的偏移量也不同,偏移就是根据当前指针的类型偏移与当前类型相同的指针长度(就
//是 +1 后的增量不同 ---> 因为类型不同,加的 ”1“ 的大小不同)
printf("%d %d\n", p,&arr1[0]);
printf("%d %d\n",p +1 ,&arr1[0]+1);
- 用法:按找上图的定义,就相当于给 arr1 又起了一个新的名字 *p
*p == arr1; ---> 任何用 arr1 的地方都可以换成 *p
(*p)[0] == arr1[0]; ----> 注意:[] 的优先级 大于 * 因此要加()
(*p)[1] == arr1[1];
写法二: *((*p) + 1) == arr1[1]; ---> 根据 [i] 就是 + i 再整体取 *