数组作为函数参数
数组元素作为函数实参
数组元素可以用作函数实参,但是不能用做形参。因为形参是在函数被调用时临时分配储存单元的。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。数据传递方向是从实参传到形参,单向传递。
一维数组作为函数参数
除了可以用数组元素作为函数参数外,还可以用数组名作为函数参数(包括实参和形参)。当用数组元素做实参时,向形参变量传递的是数组元素的值,而用数组名作为函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
【例1】求n个数的平均值
本题要求实现一个函数,可求n个数的平均值。
编写程序:
#include <stdio.h>
float aver ( float b[], int n )
/*形参数组也可以不指定大小,在定义数组时在数组名后加一个空的方括弧,n表示数组元素的个数*/
{
float sum=0;
int i;
for(i=0;i<n;i++)
sum+=b[i]; //累加
return sum/n; //返回平均值
}
int main()
{
float ave , a[10000] ;
int i,n;
scanf("%d",&n);
for (i=0 ; i<n ; i++ )
scanf ("%f", &a[i] ) ;
ave =aver (a , n ) ;
printf ("%.2f\n", ave);
return 0;
}
运行结果:
5
10 21 34 9 8
16.40
程序说明:
(1)上述程序中a是实参数组名,b是形参数组名,分别在其所在函数被定义,不能只在一方被定义。
(2)实参数组与形参数组的类型应该一致。
(3)如果在定义形参数组,声明了形参数组的大小(上述程序没有声明大小,数组名后直接加的方括弧),实际上是不起作用的。C语言编译器不检查形参数组大小,只是将实参数组的首元素的地址传递给形参数组名。
二维数组作为函数参数
【例2】有一个3X4的矩阵,求所有元素的最大值。
编写程序:
#include<stdio.h>
int MaxValue(int array[3][4])
{
int i,j,max;
max=array[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]>max)
max=array[i][j];
return max;
}
int main()
{
int arr[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};
printf("%d\n",MaxValue(arr));
return 0;
}
运行结果:
34
程序说明:
形参数组array的第一维的大小可以省略,可以写成array[][4],但第二维大小不能省略,而且要和实参数组arr的第二维大小相同。
局部变量和全局变量
局部变量和全局变量的关系就相当于班长和辅导员的关系,比如:一个辅导员管理着计科1905班和计科1906班,而这两个班的班长只能管理着他们自己的班级,而不能插手另一个班级,并且都要听辅导员的管理。
变量的存储类别
程序运行时的存储空间被分为代码区和数据区(静态存储区和动态存储区)
局部变量采用动态存储方式,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。
全局变量采用静态存储方式,在程序开始执行时给全局变量分配存储区,程序执行完毕释放。
定义变量
【存储类别】 类型 变量名;
存储类别
auto:声明自动变量
register:声明寄存器变量
static:声明静态变量
extern:声明外部变量的作用范畴
宏定义
在C语言源程序中允许使用一个标识符表示一个字符串,称为宏。被定义的宏标识符称为宏名。在编译预处理时,对程序中所有出现的宏名都将用宏定义中的字符串代替。在C语言中,宏分为有参数和无参数两种。
无参数宏定义
一般形式:
#define 标识符 字符串
例如:
#define PI 3.14159
【例3】
#include<stdio.h>
#define M (y*y+3*y) //无参数宏的定义
int main()
{
int y,result;
scanf("%d",&y);
result=3*M+4*M+5*M;
printf("%d\n",result);
return 0;
}
运行结果:
2
120
程序说明:
(1)习惯上用大写字母表示宏名,但也允许用小写字母。
(2)宏定义必须写在函数之外,其作用域为从宏定义命令起到源程序结束。如果终止其作用域可使用#undef命令。例如:
#define PI 3.14159
int main()
{
...
}
#undef PI //终止宏PI的作用域
void fl()
{
...
}
带参数的宏定义
C语言允许宏带参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏进行调用,不仅要进行宏展开,还要用实参去替换形参。
一般形式:
#define 宏名(形参表)字符串
例如:
#define M(y) y*y+3*y //宏定义
...
result =M(2); //宏调用
...
题目:
以下程序运行的结果是_____.
#include <stdio.h>
#define ADD(x) x+x
int main()
{
int m=1,n=2,k=3;
int sum=ADD(m+n)*k;
printf(“sum=%d\n”,sum);
return 0;
}
正确答案:10
题目分析:
这个题目有很多同学会得出错误答案12或18等。具体错误原因是这里的形参“x+x”并没有用括号,所以这里计算要有加减乘除的优先级。
sum=1+2+1+2*3=10