欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-16 18:10:35
字面意思理解指针数组:实质是一个数组,这个数组中存储的内容全部是指针变量数组指针:实质是一个指针,这个指针指向一个数组第一个: int *p[5];核心是p,先与[]结合组成一个数组,共有5个元素,数组中的元素都是指针,指针指向的元素是int类型,整个符号是一个数组。第二个:int (*p)[5];核心是p,p先和星号结合组成一个指针,指针指向一个数组,数组有5个元素,数组中存放的是int类型的元素,整个符号是一个指针。第三个: int *(p[5]);和第一个含义一样,加上括号,便于理解...

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

第一个: 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