引入
我们现在搞清楚了数组的地址以及如何使用指针来调用数组和数组元素,现在我们用指向数组的指针作为函数的参数,看看有什么新玩法!
用指向数组的指针作为函数参数
一维数组和多维数组的数组名可以作为函数参数。我们如果使用指针变量作为形参,那么接收到的是从实参发送过来的地址。
传送地址有两种方法:
- 用指向变量的指针变量,这就是变量的地址。
- 用指向一维数组的指针变量,这就是该数组的首地址。
举个例子
问题:
有一个班,3名学生,各学4门,计算总平均分,以及第n个学生的成绩。
思路:
3个学生,各学4们,这就是一个 3X4 的多维数组。
计算第 n 个学生的成绩,这就是知道行元素,求列元素的总和。
解题:
#include <stdio.h>
int main(){
int ave(int *pointer_list);
int search(int (*p)[4],int n);
int list[3][4]={{88,44,66,100},{66,88,97,78},{88,99,98,78}};
int i;
printf("总平均分是:%d\n",ave(*list));
printf("请输入要查询的考生编号:\n");
scanf("%d",&i);
printf("%d号考生的总成绩是:%d",i,search(list,i));
return 0;
}
int ave(int *pointer_list){
int count=0;
int *num_end;
num_end=pointer_list+12;
for(;pointer_list<num_end;*pointer_list++){
count=count + *pointer_list;
}
return count/12;
}
int search(int (*p)[4],int n){
int count=0;
for(int i=0;i<4;i++){
count=count+*(*(p+n)+i);
printf("%d ",*(*(p+n)+i));
if (i==3) {
printf("\n");
}
}
return count;
}
分析
求平均数时
在求平均数时,实参传递过去的是:
p=*list;
p 接收到的地址实际上是list[0][0]的地址,这就是 list 数组的子元素,我们通过移动指针就可以遍历这个数组。
在求平均数时,形参接收到的:
p=&list[0][0];
接收到的是元素的地址,然后我们再一次通过*号取到了这个元素的数值,并且进行累加。
搜索某个学生成绩时
在搜索某个学生的成绩时,实参传递过去的是 list 这个二维数组的地址。
p=list;
然后我们通过对这个地址移动指针,找到对应的学生,号找到这个学生的地址。
然后用 for 循环遍历这个学生的成绩,并再次用号输出出来。
所以,指向数组的指针作为函数参数传递过来的只有两种情况,要么是变量,也就是在求学生平均数时,传递具体子元素的地址;
要么是数组,也就是在搜索学生成绩时,传递过来的 list 的数组地址。
再来个例子
问题
在上一题的基础上,找出有一门以上课程不及格的考生,并输出其各科成绩。
思路
在上面搜索的基础上,记录当时 n 和 i 的值即可定位该考生,然后将其成绩输出即可。
解题
#include <stdio.h>
int main(){
int list[3][4]={{88,55,66,100},{66,44,97,78},{88,99,22,78}};
void pass(int (*p)[4]);
pass(list);
return 0;
}
void pass(int (*p)[4]){
void out(int (*p)[4],int a,int b);
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(*(*(p+i)+j)<=60){
out(p,i,j);
}
}
}
}
void out (int (*p)[4],int a,int b){
printf("%d号考生的第%d科不及格,其他成绩是:\n",a,b+1);
for(int i=0;i<4;i++){
printf("%d ",*(*(p+a)+i));
}
printf("\n");
}
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。
评论