- 调用函数:
- 1.传值调用:
- 2.传址调用:
- 3.嵌套调用:
函数名(参数值);
- ()起到了表示函数调用的重要作用,即使没有参数也需要(),如果有参数,则需要给出的正确的数量,类型和顺序,这些值会按照顺序依次被用来初始化函数中的参数
- 调用函数时给的值与参数的类型不匹配是C语言传统上最大的漏洞,编译器总是悄悄替你把类型转换好,但是这很可能不是你所期望的,后续的语言,C++/Java在这方面很严格。
顾名思义,传值调用就是把实参变量的值传给被调用函数的形参变量。
void swap(int x,int y);
int main()
{
int a =5;
int b=6;
swap(a,b);
printf("a=%d b=%dn",a,b);
return 0 ;
}
void swap(int x,int y)
{
int t = x;
x = y;
y = t;
}
这样的代码显然不能交换变量a和变量b的值,因为每个函数都有它自己的变量空间,参数也位于这个独立的空间中,和其它函数没有关系。C语言在调用函数时,只能将变量的值传递给函数,而非将整个变量传递给函数,如这次调用,只是把main函数实参变量a和变量b的值传递给了调用函数的形参变量x和变量y,swap函数只是对自己变量空间中的变量x和y做了变换,并未对main函数变量空间中的变量a,b做出任何动作。
2.传址调用:顾名思义,就是把实参变量的地址传递给被调用函数的形参变量,这种传参方式可以让函数和函数外边的变量建立起正真的联系,也就是函数内部可以直接通过地址操作函数外部的变量。
void swap(int *px, int *py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a = 1;
int b = 2;
swap(&a, &b);
printf("a = %d b = %dn", a, b);//a = 2,b = 1
return 0;
}
上述swap函数的形参是指针变量,传过去的是地址,在上述代码调用swap函数的时候,是把a和b的地址传了过去,这样在swap函数中就可以通过地址直接对main函数中的变量进行操作,所以这个swap函数可以改变main函数中的变量值。
3.嵌套调用:就是某个函数调用一个函数,该函数中又调用着其他函数。
#include//对调用函数的原型声明 void loveYouTooMuch(); void loveYou(); int main() { loveYouTooMuch();//调用函数 return 0; } void loveYouTooMuch()//主函数调用该函数,该函数又调用了另一个函数 { loveYou(); } void loveYou() { printf("I love You"); }
注: 函数不能嵌套定义,但是可以嵌套调用



