C语言地址传递与值传递


1、在C语言中,所有非数组形式的数据实参都是以值传递的形式调用,在值传递的过程中,被调用函数的形式参数被视为该函数的局部变量,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。所以被调用函数不能修改作为实参的实际变量的值,而只能修改传递给他的那份备份。

2、而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址,被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

3、同时,还有一个问题值得大家注意:无法向函数传递一个数组

可以验证一下:

  1. void fun(char a[10])  
  2. {  
  3.     int i = sizeof(a);  
  4.     char c = a[3];  
  5. }  

如果数组真的传递到函数内部,那么i的值应该是10,可惜,i的值为4,的确没有传递过去。

C语言中,当一维数组作为函数的参数时,编译器总是把它解析成一个指向其首元素地址的指针。

针对上面的值传递与地址传递,下面用代码说明问题:

  1. /*  
  2.  * main.c  
  3.  *  
  4.  *  Created on: Apr 28, 2012  
  5.  *      Author: root  
  6.  */  
  7.   
  8. #include <stdio.h>  
  9.   
  10. void swap_val(int x, int y)  
  11. {  
  12.     int temp;  
  13.   
  14.     temp = x;  
  15.     x = y;  
  16.     y = temp;  
  17.   
  18.     printf("x = %d, y = %d\n", x, y);  
  19. }  
  20.   
  21. void swap_addr(int *x, int *y)  
  22. {  
  23.     int temp;  
  24.   
  25.     temp = *x;  
  26.     *x = *y;  
  27.     *y = temp;  
  28. }  
  29.   
  30. int main(void)  
  31. {  
  32.     int a, b;  
  33.   
  34.     printf("please input two integer\n");  
  35.     scanf("%d %d", &a,&b);  
  36.     if (a < b) {  
  37.         swap_val(a, b);  
  38.         printf("a = %d, b = %d\n", a, b);  
  39.         swap_addr(&a, &b);  
  40.         printf("a = %d, b = %d\n", a, b);  
  41.     }  
  42.   
  43.     return 0;  
  44. }  

验证结果如下:

please input two integer
1
2
x = 2, y = 1
a = 1, b = 2
a = 2, b = 1

相关内容