C语言函数间参数的传递方式(二)没有返回,仅仅靠形参、实参传递参数的函数
这一篇我们来看看没有返回,只靠形参、实参传递参数的函数,先来学习最简单的一种:
1、传值调用(赋值传递)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void swap(int a,int b) 6 { 7 int temp; 8 printf("交换前,a=%d b=%d \n",a,b); 9 temp=a; 10 a=b; 11 b=temp; 12 printf("交换后,a=%d b=%d \n",a,b); 13 } 14 int main() 15 { 16 int x=10,y=20; 17 printf("交换前,x=%d y=%d \n",x,y); 18 swap(x,y); 19 printf("交换后,x=%d y=%d \n",x,y); 20 return 0; 21 }
从运行程序结果可以看出:被调函数swap只对形参操作,实参无变化。显然,传值调用属于单向值传递,函数运行结果不影响、不改变调用函数的实参。看过了最简单的,下面来看看复杂一点儿的————引用调用(指针传递、赋地址传递)。C语言中,这个词也被叫做“指针传递”、“赋地址传递”。在C++语言中,则有另外的含义了。用起来,也会方便许多,但是,C语言不支持。引用调用(指针传递、赋地址传递)分为同级指针传递,和二级指针传递2种方式,下面先来看看同级指针传递:
2、同级指针传递
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void swap(int * a,int *b) 6 { 7 int temp; 8 printf("a地址:%p b地址:%p \n",a,b); 9 printf("交换前,a=%d b=%d \n",*a,*b); 10 temp=*a; 11 *a=*b; 12 *b=temp; 13 printf("交换后,a=%d b=%d \n",*a,*b); 14 } 15 int main() 16 { 17 int x=10,y=20; 18 printf("x地址:%p y地址:%p\n",&x,&y); 19 printf("交换前,x=%d y=%d \n",x,y); 20 swap(&x,&y); 21 printf("交换后,x=%d y=%d \n",x,y); 22 return 0; 23 }
本例传输的是2个变量的地址,实参传送的是&x,&y2个变量的地址,形参定义了2个指针变量int *a,int *b来接收,相当于a=&x,b=&y。如果把&x和&y也看成指针,则有*a=*(&x)=x,*b=*(&y)=y。显然,对其解引用后,所得值为变量的值,而不是地址。所以称之为同级指针传递。