函数分有参数函数和无参数函数,函数参数当然只有参数的函数。函数参数就是我们写函数名称后圆括号内的常量值、变量、表达式或函数。当我们定义函数时,这 是的参数有称为形式参数,形式参数不能是常量值。当我们引用或调用该函数时,这是的参数有称为实际参数(实参)。形式参数的类型说明可在函数体{}与紧跟 在函数名之后的()之间,也可在()之内,目前流行的风格应是在括号内。这是一种风格问题,可以依照个人习惯。


在函数调用时,大多数的情况下,主函数和被调用的函数之间有数据传递关系,在传递数据时情况较复杂,但记住一点就是参数类型必须匹配,数量一般也相等(除在某些库函数用省时后续参数),集中较复杂的情况说明如下:


1,强制类型转换。这些类型转换必须是c语言中可进行的。如形参说明为int,而实参为float型,那么在实际处理时按float型处理。

2,数据类型转换。包括字符串,在调用函数时传递实参变量数组的目前地址,或字符串的首指针。

3,在以函数或表达式做参数时,实参形式的表达式或函数必须有确定的与形参类型匹配的值,

另外还应注意,c中规定,时参变量对形参变量的数据传递都是在局部的情况下单向传递的,只能是参传递给形参,而不能把形参传递给实参,但是如果实参变量和 形参变量都是全局变量时就不同了,这时形参的改变会影响实参的改变,这在某些场合中是一种非常有用的方法。比如我们编写两个矩阵相乘的函数,两个实参形式 的矩阵相乘函数调用一个函数时,相乘的结果(两矩阵相乘)要返回到调用函数,这是用全局变量就是一种折中的方法,但最好的方法还是采用函数参数直接返回的 方法,下面是用全局变量的方法实现的数组之间的乘法,用来说明参数的传递。


/*****************A=B*C******************/ #include<stdio.h>

#include<conio.h>

#define X 3

#define Y 3


int a[X][Y];

int b[X][Y];

int c[X][Y];


void matrix(int b[][X],int c[][Y]);

main()

{

int i,j,temp;

clrscr();

printf(" lease input int matrix b[%d][%d]"n",X,Y);

for(i=0;i<Y;i++) /*输入要进行运算的数组*/ for(j=0;j<Y;j++){

scanf("%d",&temp);

b[j]=temp;
}
printf(" lease input int matrix c[%d][%d]"n",X,Y);
for(i=0;i<X;i++) /*输入要进行运算的数组*/ for(j=0;j<Y;j++){
scanf("%d",&temp);
c[j]=temp;
}
matrix(b,c);
printf("Now print resource matrix b[%d][%d]=",X,Y);
for(i=0;i<X;i++){
printf(""n"  ;
for(j=0;j<Y;j++)
printf("%d ",b[j]);
}
printf(""n"  ;
printf("Now print  resource matrix c[%d][%d]=",X,Y);
for(i=0;i<X;i++){
printf(""n"  ;
for(j=0;j<Y;j++)
printf("%d ",c[j]);
} /*完成对输入的相应,即把输入的数组打出来*/ printf(""n":lol ;
printf("Now printm multiply results matrix a[%d][%d]=B*C:",X,Y);
for(i=0;i<X;i++){
printf(""n":lol ;
for(j=0;j<Y;j++)
printf("%d ",a[j]);
}/*打出结果*/ getch();
return 0;
}
/**********************计算数组乘法的子函数************************/ void matrix(int b[][X],int c[][Y])
{
int i,j,k,temp;
for(i=0;i<X;i++)
for(j=0;j<Y;j++){
for(k=0;k<Y;k++)
a[j]+=b[k]*c[k][j];
}
}

大家可看出,函数参数像数学中的函数一样,在数学中,y=f(x)是基本的函数表达形式,x可看作是参数,y可看作是返回值;z=f(x,y)事二元函数,有两个参数,在C语言中对应于两个参数的函数。这样大家或许明白了什么时函数及函数参数了吧。