文章目录

  • 指针复习回顾
  • 概念理解
  • 【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是数组的长度,因此它是一个数组指针。

易混知识 | 数组指针 VS 指针数组_数组

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]);

易混知识 | 数组指针 VS 指针数组_指针数组_02


如上图可证得,对数组指针解引用(*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));

易混知识 | 数组指针 VS 指针数组_数组_03

在这里插入代码片

【2】指针数组(array of pointers)

  • 形式:int *p2[n];
  • 指针数组:首先它是一个数组,其次它是一个用来存放指针的数组!
int *p2[n];

对于*p2[n],先看[ ] ,可知它是一个数组,其次该数组中的元素是指针类型,即它是存放指针的数组。

易混知识 | 数组指针 VS 指针数组_数组指针_04


栗子;

#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;
}

总结

  • 数组指针 —> 是指针 —> 是一种指向数组的指针 — 存放的是数组的地址。
  • 指针数组 —> 是数组 —> 是一种存放指针的数组。

完结
✨✨请各位小伙伴多多点赞关注收藏支持鸭!✨✨