人之所以痛苦,那是因为你在成长。--------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个字节,所以叫指向元素的指针变量。
来源:CSDN
作者:一万年太久,只争朝夕。
链接:https://blog.csdn.net/magic_guo/article/details/104737952