朱有鹏老师课程总结指针数组和数组指针

2022-08-06

字面意思理解
指针数组:实质是一个数组,这个数组中存储的内容全部是指针变量
数组指针:实质是一个指针,这个指针指向一个数组

第一个: int *p[5];
核心是p,先与[]结合组成一个数组,共有5个元素,数组中的元素都是指针,指针指向的元素是int类型,整个符号是一个数组。

第二个:int (*p)[5];
核心是p,p先和星号结合组成一个指针,指针指向一个数组,数组有5个元素,数组中存放的是int类型的元素,整个符号是一个指针。

第三个: int *(p[5]);
和第一个含义一样,加上括号,便于理解和辨识。

关键在与搞清楚所定义的核心首先是和哪个符号先结合的。和星号先结合,就是指针,和[]先结合,就是数组。

指针数组简单应用

	int a = 1,b = 2,c = 3,d = 4,e = 5;
	int  *(p[5]);
	int i;
	p[0] = &a;
	p[1] = &b;
	p[2] = &c;
	p[3] = &d;
	p[4] = &e;
	printf("a的地址:0X%p\n",&a);
	printf("b的地址:0X%p\n",&b);
	printf("c的地址:0X%p\n",&c);
	printf("d的地址:0X%p\n",&d);
	printf("e的地址:0X%p\n",&e);
	putchar('\n');
	for(i=0;i<5;i++)
	{
		printf("p[%d]内的地址:0X%p\n",i,p[i]);
	}

先将5个int类型变量的地址都存放进指针数组p内部,分别打印出普通int变量的地址,以及指针数组中每个元素内的值,和指针数组中每个元素指向的变量的值。对比其结果

从结果可以知道,指针数组内部每个变量内存放的就是相对应的五个int类型变量的地址;指针数组中每个元素指向的变量的值也都分别等于五个int类型的变量的值。
所以指针数组可以简单的理解为,一个只能用于存放某种类型变量的地址的数组。可以批量管理某一种指针类型。int *p[5];和int *(p[5]);就和定义了5个int *;类型的指针变量没有区别。

	int arr[5] = {1,2,3,4,5};
	int  *(p[5]);
	for(i=0;i<5;i++)
	{
		p[i] = &arr[i];
	}
	for(i=0;i<5;i++)
	{
		printf("arr[%d]的地址:0X%p\n",i,&(arr[i]));
	}
	putchar('\n');
	for(i=0;i<5;i++)
	{
		printf("p[%d]内的地址所指向的值:%d\n",i,*(p[i]));
	}

存放数组的地址也是可以的。

数组指针简单应用

	int a[5]={1,2,3,4,5};
	int (*p)[5];
	int i;
	p = &a;
	printf("数组a[5]的首地址:%p\n",&a);
	printf("数组指针p内部的地址:%p\n",p);
	putchar('\n');
	for(i=0;i<5;i++)
	{
		printf("(*p)[%d]   = %d\n",i,(*p)[i]);
		printf("*((*p)+%d) = %d\n",i,*((*p)+i));
	}

将数组a[5]的首地址给数组指针p,查看数组a[5]的地址和数组指针内的值是否相等。并且利用数组指针打印出a[5]的值。
运行结果

可以看出,结果没问题。数组指针就是指向了a[5]数组的首地址。数组指针的空间只有32位大小,内部只能存放一个数组的首地址,实质上就是一个指向数组的指针变量。这里用了两种方法用指针输出了a[5]中的值。此时的(*p)[]就相当于a[],(*p)+1就相当与a+1。第一种输出方式和数组普通方式输出没区别。第二种输出方式和数组用指针方式输出没区别。(星号p)可以认为就是数组名。括号不能省略,因为[]的优先级比()更高。去掉括号,就相当于(星号(p[]))。结果就会出错。

本文地址:https://blog.csdn.net/qq_16981075/article/details/107294587