数组在函数中的传值方法
我们如何让一个数组在函数中传值呢?你知道的方法有几种呢?不知道也没关系,首先我们来看一个例子
1 #include<stdio.h>
2 #define N 40
3 void ReadSocer(int socer[],int n);
4 int main(int argc, char const *argv[])
5 {
6 int n;
7 int socer[N];
8 scanf("%d",&n);
9 ReadSocer(socer,n);
10 return 0;
11 }
12
13 //读取学生的成绩
14
15 void ReadSocer(int socer[],int n)
16 {
17 int i=0;
18 for(i=0;i<n;i++)
19 {
20 scanf("%d",&socer[i]);
21 }
22 }
我们发现在main函数中有这样一段代码
ReadSocer(socer,n);
ReadSocer(),我们最开始定义的一个功能函数(这里我们强调一下如何命名一个函数,一般都采用Camel-Case命名规则!还有我们给函数起的名字一定要见名知意!),socer是什么呢?,回到函数的Line7,我们发现socer是我们定义的一个数组的名字,那么n是什么呢?同样,回到函数的Line8,n是从键盘获取的一个数字,这个数字是干嘛用的呢?printf告诉我们,“请输入学生总数”,所以这个数字代表着socer这个数组的长度!
通过这个例子我们知道,向函数传递一个数组的第一种方法是“不带方括号的数组名作为参数传递”
方法一:使用不带方括号的数组名作为参数传递(向函数传递数组首元素的地址)
- 传递的是数组的首地址
- 只复制一个地址自然比复制全部数据效率高
- 由于首地址相同,故实参数组与形参数组占用同一段内存
- 在调用函数内,不仅可以读这个数组的元素,还可以修改它们
方法二:数组元素作为函数实参
数组元素可以用做函数的实参,不能用作函数的形参,因为形参是函数被调用时临时分配的存储单元,不可能做为一个数组元素单独分配存储单元。数据传递的方式是从实参到形参,单向传递
方法三:通过定义全局变量进行传值
看一下下面这段代码
#include<stdio.h>
#define N 3
int socer[N];
void ReadSocer(int socer[],int n);
int main(int argc, char const *argv[])
{
int n;
scanf("%d",&n);
ReadSocer(socer,n);
return 0;
}
//读取学生的成绩
void ReadSocer(int socer[],int n)
{
int i=0;
for(i=0;i<n;i++)
{
scanf("%d",&socer[i]);
}
}
对比后,我们发现 int socer[N];
位置发生了变换,他从main
函数里面跑出去了,这一跑真可谓是鱼跃龙门,由当初的局部变量跳转成全局变量,原来只掌握巴掌大的一块小地方,现在的socer[N]
呢,掌握全局,无论在哪里,什么时候都可以用!