其中,返回类型 函数名称(形式参数列表) 称之为 函数签名,也叫做 函数头;而一对大括号及其内部的所有的代码被称之为 函数体;所以,函数由函数签名和函数体两部分组成。需要注意的是,函数不像 if 或者 for 那样,当代码只有一行的时候可以省略大括号,无论函数中是否有代码或有几行代码,都不允许省略大括号!如果只是声明函数,可以省略函数体,但是这样的函数是在使用前必须有完整的函数体,否则在编译的时候出错导致编译失败。
#include/*** 交换两个数*/ voidswap(int x,int y){printf("\tbefore swap. x = %d, y = %d.\n", x, y);int z = x;x = y;y = z;printf("\tafter swap. x = %d, y = %d.\n", x, y); }intmain(){int a =10, b =20;printf("before swap. a = %d, b = %d.\n", a, b);swap(a, b);printf("before swap. a = %d, b = %d.\n", a, b);return0; }
执行结果:
before swap. a = 10, b = 20.before swap. x = 10, y = 20.after swap. x = 20, y = 10. before swap. a = 10, b = 20.
不难发现,从 main 函数中已经成功将值传递到函数 swap 内部,并实现交换,但是这种传递方式不影响 main 函数中的两个变量的值。
#include/*** 交换两个数*/ voidswap(int*x,int*y){printf("\tbefore swap. x = %d, y = %d.\n", x, y);int z =*x;// printf("swaping. *x = %d, *y = %d, z = %d.\n", *x, *y, z);*x =*y;// printf("swaping. *x = %d, *y = %d, z = %d.\n", *x, *y, z);*y = z;// printf("swaping. *x = %d, *y = %d, z = %d.\n", *x, *y, z);printf("\tafter swap. x = %d, y = %d.\n", x, y); }intmain(){int a =10, b =20;printf("before swap. a = %d, b = %d.\n", a, b);swap(&a,&b);printf("before swap. a = %d, b = %d.\n", a, b);return0; }
执行结果:
before swap. a = 10, b = 20.before swap. x = 2293564, y = 2293560.after swap. x = 2293564, y = 2293560. before swap. a = 20, b = 10.
不难发现,这种传递方式不是传递的值本身,而是传递的是两个变量的地址值,在函数内部使用 * 获取对应地址值使得两个地址中的值发生交换,进而让 main 函数中的两个变量的值发生变化。
有关指针的更多内容请移步到《指针》
函数的先后关系
在上面的案例中,源程序包含两个函数分别是 swap 和 main, 而且是先编写了 swap 函数,再编写 main 函数,如果将两个函数的位置交换位置,会在编译源程序的时候,可能会出现两个警告个一个提示:
warning: implicit declaration of function 'swap' [-Wimplicit-function-declaration] ... warning: conflicting types for 'swap' ... note: previous implicit declaration of 'swap' was here
这是因为在编译器在编译源程序的时候,是自上往下逐行解析源代码的,当遇到在 main 函数中遇到 swap 之前没有发现该函数在此之前被声明过就被使用了。故而,推荐的做法是,将 自定义的函数写在 main 函数的前面,或者,将函数签名写在 main 函数前面作为声明,这样编译器就不会在遇到 swap 函数的时候提示警告了。如下所示:
#include/*** 声明 swap*/ voidswap(int*x,int*y);intmain(){int a =10, b =20;printf("before swap. a = %d, b = %d.\n", a, b);swap(&a,&b);printf("before swap. a = %d, b = %d.\n", a, b);return0; }/*** 定义 swap*/ voidswap(int*x,int*y){printf("\tbefore swap. x = %d, y = %d.\n", x, y);int z =*x;// printf("swaping. *x = %d, *y = %d, z = %d.\n", *x, *y, z);*x =*y;// printf("swaping. *x = %d, *y = %d, z = %d.\n", *x, *y, z);*y = z;// printf("swaping. *x = %d, *y = %d, z = %d.\n", *x, *y, z);printf("\tafter swap. x = %d, y = %d.\n", x, y); }