文章目录
- 指针复习回顾
- 概念理解
- 【1】数组指针(a pointer to an array)
- 【2】指针数组(array of pointers)
- 总结
指针复习回顾
- 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
- 指针的大小是固定的4/8个字节。(32位/64位)
- 详细内容回顾《初阶指针(Pointer)—【C语言】》
概念理解
只要在“数组指针”和“指针数组”中间加上一个“的”,就能够很好理解了。
【1】数组指针(a pointer to an array)
- 形式:int (*p1)[n];
- 数组
的
指针:首先它是一个指针,其次它还是一个指向数组的指针!
示例分析:
int (*p1)[n];
优先级规则:()> [ ] > *
对于(*p1)[n],先看括号()
,可知p1是一个指针,再看中括号[ ]
,可知这个指针是指向一个数组的,n是数组的长度,因此它是一个数组指针。
int arr[] = { 1,2,3,4,5,6 };
有一个arr数组,我们知道arr即是数组名,也是数组首元素的地址。我们也可以定义一个指针来指向这个数组并调用数组里面的元素。
int arr[] = { 1,2,3,4,5,6 };
int (*p)[] = &arr;
小规律:
- 一个变量取地址(&)就相当于原来的类型加上一个 *
- 一个指针解引用就相当于原来的类型减一个 *
例如:
int a=1;
int* p=&a;
printf("%d",*p);
对a取地址后(&a),获得的类型是int*。(int* p=&a;)
对p解引用后(*p),获得的类型是int。(得到该地址中的int型的值)
对于数组来说也是一样,把数组取地址(&arr),得到的类型是原类型加上一个*
int (*arr)[];
那么用来接收这个数组地址的类型也该是
int arr[10];
int (*p)[10]=&arr;
这里p是一个指针,指向一个数组
,数组的返回类型是int型,所以它是一个数组指针。
对数组指针p解引用(*p),原类型去掉一个星,就是int p[],这里的p就代表数组名,而数组名就是数组首元素的地址
,所以解引用数组指针,就是数组首元素地址
。
int a[5] = { 1,2,3,4,5 };
int (*p)[5] = &a;
printf("%p\n%p\n", *p,&a[0]);
如上图可证得,对数组指针解引用(*p)= %arr[0]
而想要获得数组中的元素,只需要首元素地址加一个数i,再解引用就能得到第i个元素了
int a[5] = { 1,2,3,4,5 };
int (*p)[5] = &a;
printf("%d %d %d\n", *(*p+0), *(*p + 1), *(*p + 3));
在这里插入代码片
【2】指针数组(array of pointers)
- 形式:int *p2[n];
- 指针
的
数组:首先它是一个数组,其次它是一个用来存放指针的数组!
int *p2[n];
对于*p2[n],先看[ ] ,可知它是一个数组,其次该数组中的元素是指针类型,即它是存放指针的数组。
栗子;
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int* p[3] = { &a,&b,&c,&d,&e };//该指针数组 存放着a,b,c,d,e的地址
for(int i = 0; i < 5; i++)
{
printf("%d ", *p[i]);//*p解引用
//结果:1 2 3 4 5
}
return 0;
}
总结
-
数组指针
—> 是指针
—> 是一种指向数组的指针 — 存放的是数组的地址。 -
指针数组
—> 是数组
—> 是一种存放指针的数组。
完结
✨✨请各位小伙伴多多点赞关注收藏支持鸭!✨✨