。 变量min是imin()私有的,但是return语句把min的数值返回给了调用函数。下面这个语句相当于把min的值赋给lesser lesser=imin(m,n); 但是,我们可以用下面这个句子吗? 1 imin(m,n); 2 lesser=min; 答案是否定的!!因为调用函数不知道min变量的存在。imin()中的变量是该函数的局部变量。我们前面说了,函数是一个“黑盒子”,里面的东西对main()函数来说是不可见的。 我们还可以使用下面的代码来简化程序 1 int imin(int m,int n) /*函数定义*/ 2 { 3 return (m 4 } return语句的另一个作用是终止执行函数,并把控制返回给调用函数的下一个语句。既是return语句不是函数的最后一个句子,其执行结果也是如此。因此我们可以这样辨析imin()函数 1 int imin(int m,int n) /*函数定义*/ 2 { 3 int min; 4 if(m 5 return m; 6 else 7 return n; 8 } 也可以使用下面的句子 return; 这个语句会终止执行函数并把控制返回给调用函数。因为return后没有任何表达式,所以没有返回值,这种形式只能用于void类型的函数之中 为了进一步了解函数的“黑盒子”性质,程序如下 1 #include 2 void mikado(int); /*声明函数原型*/ 3 4 int main(void) 5 { 6 int pooh=2,bah=5; 7 printf("In mian(), pooh=%d and &pooh=%p\n",pooh,&pooh); 8 printf("In main(), bah=%d and &bah=%p\n",bah,&bah); 9 mikado(pooh); 10 return 0; 11 } 12 13 void mikado(int bah) /*函数定义*/ 14 { 15 int pooh=10; 16 printf("In pikado(), pooh=%d and &pooh=%p\n",pooh,&pooh); 17 printf("In mikado(), bah=%d and &bah=%p\n",bah,&bah); 18 } output: In mian(), pooh=2 and &pooh=0028FF1C In main(), bah=5 and &bah=0028FF18 In pikado(), pooh=10 and &pooh=0028FEEC In mikado(), bah=2 and &bah=0028FF00 上述的output说明了几个问题: 首先,两个pooh变量具有不同的地址,两个bah变量也是这样,证明了函数的“黑盒子”性质;第二,main()函数调用mikado(pooh)把实际参数(main()中的pooh值2)传递给了mikado(int bah)中的形式参数。注意:这种传递只是进行了数值传递,两个变量(main()中的pooh和mikado()中的bah)仍分别保持原来的特性,再一次证明了函数的“黑盒子”性质。 改变调用函数中的变量 如果我们要交换变量怎么办?也许我们会使用下面的程序 1 #include 2 void interchange(int u,int v); /*声明函数原型*/ 3 int main(void) 4 { 5 int x=5,y=10; 6 printf("Originally x=%d and y=%d.\n",x,y); 7 interchange(x,y); 8 printf("Now x=%d and y=%d.\n",x,y); 9 return 0; 10 } 11 12 void interchange(int u,int v) /*函数定义*/ 13 { 14 int temp; 15 16 temp=u; 17 u=v; 18 v=temp; 19 } output: Originally x=5 and y=10. Now x=5 and y=10. 但是这是错误的程序,调用函数中的变量没有发生改变。void interchange(int u,int v)中的temp,u,v都是局部变量,它们都处于“黑盒子”中,对main()来说是不可见的。在函数中对变量的改变不会影响main()中的变量。我们可以通过下面的程序来验证: 1 #include 2 void interchange(int u,int v); /*声明函数原型*/ 3 int main(void) 4 { 5 int x=5,y=10; 6 printf("Originally x=%d and y=%d.\n",x,y); 7 interchange(x,y); 8 printf("Now x=%d and y=%d.\n",x,y); 9 return 0; 10 } 11 12 void interchange(int u,int v) /*函数定义*/ 13 { 14 int temp; 15 16 printf("Originally u=%d and v=%d\n",u,v); 17 temp=u; 18 u=v; 19 v=temp; 20 printf("Now u=%d and v=%d.\n",u,v); 21 } output: Originally x=5 and y=10. Originally u=5 and v=10. Now u=10 and v=5. Now x=5 and y=10. 这样我们又一次证明了“黑盒子”性质 也许我们可以用return来返回值,进行数值调换。但是return语句只能把一个数值传递给调用函数,而数值交换需要传递2个的数值给调用函数。 可以用指针来实现! 1 #include 2 void interchange(int * u,int * v); /*声明函数原型*/ 3 int main(void) 4 { 5 int x=5,y=10; 6 printf("Originally x=%d and y=%d.\n",x,y); 7 interchange(&x,&y); /*向函数传递地址*/ 8 printf("Now x=%d and y=%d.\n",x,y); 9 return 0; 10 } 11 12 void interchange(int * u, int * v) /*函数定义*/ 13 { 14 int temp; 15 temp=*u; 16 *u=*v; 17 *v=temp; 18 } 这样,就进行了数值交换 完成。
摘自 owen-beta
|