歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

Copyright © Linux教程網 All Rights Reserved