数组名做参数
说明:
l 用数组名称作函数参数,应该在主调函数和被调函数分别定义数组,本例中array是形参数组名,score是实参数组名,分别在其所在的函数中定义,不能只在一方定义。
float average(float array[10]){
int i;
float aver,sum=array[0];
main(){
float score[10],aver;
int i;
l 实参数组与形参数组类型应该保持一致(这里都为float型),如不一致,结果将出错。
l 在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C编译器对形参数组大小不做检查,只是检查实参数组的首地址传给形参数组。因此,score[n]和array[n]指的是同一单元。
l 形参数组也可以不指定大小,在定义数组时在数组名后面跟一个空的方括号
最后应该说明一点:用数组名作为函数实参的时,不是吧数组元素的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共占同一段内存单元。
假如a的起始地址为1000,则b数组的起始地址也是1000,显然a和b同占一段内存单元,a[0]和b[0]同占一个内存单元……。由此,我们可以看到,形参数组中各个元素的值如果发生变化会使实参数组元素的值同时发生变化
|
实参类型 |
变量名
|
数组名
|
| 要求形参的类型
|
变量名
|
数组名或指针变量
|
| 传递的信息
|
变量的值
|
实参数组首元素的地址
|
| 通过函数调用能否改变实参的值
|
不能
|
能
|
再强调一点:实参数组名代表一个固定的地址,或者说是一个指针型常量,而形参数组并不代表一个固定的地址值。作为指针变量,在函数调用开始时,它的值等于实参数组起始地址,但在函数执行期间,它可以再被赋值。例如:
f(arr[], int n){
printf("%d/n", *arr); //输出array[0]的值
arr=arr+3;
printf("%d/n", *arr); //输出array[3]的值
}
浙公网安备 33010602011771号