C语言--指针与多维数组的关系

╄→尐↘猪︶ㄣ 提交于 2020-03-08 20:58:34

人之所以痛苦,那是因为你在成长。--------magic_guo

多维数组,在某种意义上讲,是数组的数组的数组…。
比如二维数组,相当于数组的数组,即在一维数组的基础上,建立的另一个一维数组。
一维数组和指针的关系是:数组名代表数组中首元素的地址,而在多维数组中也是这样。
只不过多维数组的数组名和一维数组的名,值是一样的,但意义不同。
下面的一切都以二维数组为例:
例如:
a = {{1, 2, 3, 4}, {5, 6, 7, 8, 9}, {10, 11, 12, 13}}
二维数组的数组名a相当于排长,而二维数组中一维数组的数组名{a[0], a[1], a[2]}相当于班长。
所以当a指向的是二维数组的首元素地址,a[0]也指向二维数组的首元素地址。但是它们两个的站位不同,也就是含义不同。
所以也就不难来理解为什么a[0]+1 和 *(a+0)+1都是&a[0][1]了。
理解了这个关键点,下面来理解另一个定义:
代码:

# include<stdio.h>

// 一个班三个学生,各学四门学科, 计算总平均分数以及第n个学生的成绩

int main(void)
{
	void average(float * p, int n);
	void search(float (*p)[4], int n);
	float a[3][4]={{65, 67, 70, 60},{80, 87, 90, 81},{90, 99, 100, 98}};
	
    average(*a, 12);
	
	search(a, 2);

	

	return 0;
}

//计算平均值,使用指向元素的指针变量
void average(float * p, int n)
{
	float * p_end;
	float sum=0, aver;
	p_end = p+n-1;
	for(;p<=p_end; p++)
		sum = sum + (*p);
	aver = sum/n;
	printf("%5.2f\n", aver);
	
}

// 查找第n个学生的成绩,使用指向数组的指针变量

void search(float (*p)[4], int n)
{
	int i;
	for(i=0; i<4; i++)
	{
		printf("%5.2f ", *(*(p+n)+i));
	}
	printf("\n");
}

这次引申了的另一个定义:
1.指向元素的指针变量
2.指向数组的指针变量

代码中:float (*p)[4] 指的是定义一个为p的指针变量,指向包含4个浮点型元素的地址。在代码中,p指向了二维数组中一维数组a[0]整个数组,内存是16个字节。
float * p 指的是,定义了一个为p的指针变量,因为在题目中,p作为形参指向了二维数组的首元素,内存是4个字节,所以叫指向元素的指针变量。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!