函数里面的数据要和函数外面的数据相互传递,用什么方法呢?有人马上想到全局变量。这的确可以,但不是好方法,因为数据随时有可能被其它函数修改。也有人想到静态变量,说明这人还没明白静态变量的要领,请翻到前一章阅读。函数内部与外部数据交换,正确的方法是使用参数和返回值。
对于函数来说,外部数据要传到内部时,称之为“输入”,函数内部数据传到外部,称之为“输出”。返回值只能输出而不能输入。当需要多个输入数据,而只需要一个输出数据时,一般用参数来输入,而用返回值作输出。
#include
<stdio.h>int
sum(int
,int
); //申明时参数可以只写类型int
main(void
) {int
x, y, z; printf("请输入x和y的值:"); scanf("%d %d", &x, &y); z = sum(x, y); //调用函数求和 printf("%d + %d = %d \n", x, y, z);return
0; }int
sum(int
num1,int
num2) {return
num1 + num2 ; }
当需要多个输入和输出时,就可以考虑使用参数。参数既能输入又能输出,但基本类型作参数时,只能输入,不能输出。下面的例子不能得到满意的结果,就是因为基本类型的变量作参数。
#include
<stdio.h>void
change(int
,int
);int
main(void
) {int
x, y ; printf("请输入x和y的值:"); scanf("%d %d", &x, &y); printf("\n交换前: x = %d, y = %d \n", x, y); change(x, y); //调用函数交换数据 printf("\n交换后: x = %d, y = %d \n", x, y);return
0; }void
change(int
num1,int
num2) {int
temp; printf("\n交换前: num1 = %d, num2 = %d \n", num1, num2); temp = num1 ; num1 = num2 ; num2 = temp ; printf("交换后: num1 = %d, num2 = %d \n", num1, num2);return
; }
基本类型作参数时,C语言使用“值传送”的方法,非基本类型则采用的是“地址传送”的方法。因此,上面的问题可以改成指针作参数,问题便迎刃而解。由此可知,前面章节讲到scanf()函数时,当输入int类型数据时,为什么要用&加在变量前。
#include
<stdio.h>void
change(int *
,int *
);int
main(void
) {int
x, y ; printf("请输入x和y的值:"); scanf("%d %d", &x, &y); printf("\n前:x=%d, y=%d\n", x, y); change(&x, &y); //调用函数交换数据 printf("\n后:x=%d, y=%d\n", x, y);return
0; }void
change(int
*num1,int
*num2) {int
temp; printf("\n前:*num1=%d, *num2=%d\n", *num1, *num2); temp = *num1 ; *num1 = *num2 ; *num2 = temp ; printf("后:*num1=%d, *num2=%d \n", *num1, *num2);return
; }
基本类型作参数时,在函数中即使被修改也不能传回去,但如果是指针,修改之后就一定会改变调用处变量的值。C语言中,在参数前加上const便可阻止被修改的现象。
#include
<stdio.h>void
print(char *
,const char *
);int
main(void
) { char x[] = "quanxue"; char y[] = "C Language" ; print(x, y);return
0; }void
print(int
*s1,const int
*s2) { s1[0] = 'Q', s1[4] = 'X'; //将q→Q,x→X // s2[0] = 'c', s2[2] = 'L'; //这句编译错误 printf("%s\n%s\n", s1, s2);return
; }