数组名作为函数参数

在C语言中,用数组名作为函数参数与数组元素作为实参有所不同。数组名传递的是首地址,形参数组和实参数组共享同一内存空间。本文通过实例解释了如何使用数组名作为函数参数计算平均值,并强调了实参数组和形参数组的类型一致性、大小指定的无关性以及传递数组元素个数的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  用数组名做函数参数与用数组元素作实参有几点不同:
(1)用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。用数组名作函数参数时,则要求形参和相应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参两者类型不一致时,机会发生错误。

(2)用普通变量或下标变量作函数参数时,形参变量和实参变量都是由编译系统分配的两个不同的内存单元。在函数调用时进行的值传递是把实参变量的值赋予形参变量。在用数组名做函数参数时,不是进行值的传递,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传递是如何实现的?因为数组名就是数组的首地址。因此用数组名做函数参数时所进行的传递实际上是地址的传递,也就是把实参数组的首地址赋予形参数组名。形参数组名取得该首地址后,也就等于有了具体的地址。实际上是形参数组和实参数组为同一数组,共同使用一段内存空间。

起始地址 2000  

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]

2

4

6

8

10

12

14

16

18

20

b[0]

b[1]

b[2]

b[3]

b[4]

b[5]

b[6]

b[7]

b[8]

b[9]

  设a为实参数组,类型为整形。a占有以2000为首地址的一块内存区。b为形参数组。当进行函数调用时,进行地址传递,把实参数组a的首地址传送给形参数组名b,于是b也取得了该地址2000.至此a、b两数组共同占用以2000为首地址的一段连续内存单元。同时,a和b中下表相同的元素实际上也占相同的内存单元(整形数组每个元素占两个字节)。

例1:有一个一维数组score,存放10个学生的成绩,求平均值。

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
float average(float array[10]){
 int i;
 float aver,sum=array[0];
 for(i=1;i<10;i++)
  sum=sum+array[i];
 aver=sum/10;
 return aver;
}
main(){
 float score[10],aver;
 int i;
 printf("input 10 score:/n");
 for(i=0;i<10;i++)
  scanf("%f",&score[i]);
 printf("/n");
 aver=average(score);
 printf("average score is %5.2f/n",aver);
}

说明:

(1)用数组名作函数参数,应该在主调函数和被调函数中分别定义数组。

(2)实参数组与形参数组类型应一致,如不一致,结果将出错。

(3)实际上,指定被调函数中形参数组的大小是不起任何作用的,因为C编译器对形参数组大小不做检查,只是将形参数组的首地址传给形参数组。

(4)形参数组也可以不指定大小,定义数组时在数组名后跟一个空的中括号,为了在被调函数中处理数组元素的需要,可以另设一个参数,传递数组元素的个数。

例2:用参数传递数组元素的个数。

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
float average(float array[],int n){
 int i;
 float aver,sum=array[0];
 for(i=1;i<n;i++)
  sum=sum+array[i];
 aver=sum/n;
 return aver;
}
main(){
 float score1[5]={98.5,97,91.5,60,55};
 float score2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};
 printf("the average of class A is %6.2f/n",average(score1,5));
 printf("the average of class B is %6.2f/n",average(score2,10));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值