C语言基础(8)——函数(2)

数组作为函数参数

数组元素作为函数实参

数组元素可以用作函数实参,但是不能用做形参。因为形参是在函数被调用时临时分配储存单元的。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。数据传递方向是从实参传到形参,单向传递。

一维数组作为函数参数

除了可以用数组元素作为函数参数外,还可以用数组名作为函数参数(包括实参和形参)。当用数组元素做实参时,向形参变量传递的是数组元素的值,而用数组名作为函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
【例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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Floyed

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值