如何理解數據結構中的引用參數 &

C語言中的&是取變量邏輯地址的操做, 與變量自己所在的物理地址沒有關係,它直接與變量的值相關,即便變量自己所在的物理地址改變,&操做也沒有影響,&操做取值不會改變. 數據結構

*是取變量物理地址的操做, 即便變量自己所在的邏輯地址改變,&操做也沒有影響, &操做取值不會改變.可是 一旦物理地址中的數據改變,*操做所得的數據也將隨之改變. ide

這就像是在一棟樓房中找人,&按入住人的名字找人,*按門牌號找人, 雖然同是找人,但仍是有本質上的區別的.當且僅當門牌號對應的人按入住人姓名找的人相同的時候, 找到的人才是同一我的. 函數

 

&的用法和含義,見下面的例子: spa

main() 操作系統

{ int i=3,j=5; orm

change(i,j); 內存

printf("i1=%d %d ",i,j); ci

} input

void change(int n, int m) string

{ n=n+m;

printf("n=%d,m= %d ",n,m);

}

運行的結果爲:

i1=35

n=8, m=5

 

現把上面的程序改成:

main()

{ int i=3,j=5;

change(&i,j);

printf("i1=%d %d ",i,j);

}

void change(int &n, int m)

{ n=n+m;

printf("n=%d,m= %d ",n,m);

}

運行的結果爲:

i1=85

n=8, m=5

爲何會產生這樣的結果?

 

C語言中的&是取變量地址的操做,在執行main(){ int i=3,j=5; 時, 操做系統(os)會對變量i,j分配內存單元,如i的地址是2800os只管理2800的單元,它並不知變量i,執行i=3;則2800單元中的內容是3,用符號(2800)=3表示,執行調change函數,i的地址2800傳遞給n&n2800,在執行n+m,則2800單元中的內容變成8,(2800)=8,再退回到main時,執行 printf("i1=%d %d ",i,j);則應該把2800單元中的內容輸出(注意在os中沒有變量的處理,只有對地址的管理),這時2800單元中的內容已變成8,因此輸出是i1=85。咱們注意到此時in其實是共用的同一個地址,因此n的改變會影響上一級的模塊中的i變量,即參數的雙向傳遞!

實際中因爲c語言並非一種很是嚴謹的語言,它自己並不提供參數的雙向傳遞功能,是用地址來實現的。在數據結構的課程中,之後只要發現參數中有&符號,它就是雙向傳遞,即既有輸入又有輸出,能夠把它理解成全局量,但全局量在整個系統的全部模塊都起做用,&只在定義的函數(模塊)中起做用,能夠理解爲局部的全局量

&符號我想不出有很好和嚴謹的描述方法,若是必定要與某些東西類比,在pascal中的VAR是最接近的, Proc change(VAR n:integer, m:integer)    

 

 

關於函數參數的傳遞方式:

值傳遞:只是將參數值copy函數中,所以在函數中沒法修改該參數的值。修改的只是傳入參數的一份copy.

引用傳遞:將參數地址傳給函數,所以在函數中能修改該參數的值


 

  1. #define Fun_No_Error 1
  2. #include <stdio.h>
  3.  
  4. /*
  5.     該程序用來驗證,函數中參數的值傳遞,與引用傳遞的不一樣點
  6. */
  7.  
  8.  
  9. //Value deliver
  10. void FucValue(int a,int b)
  11. {
  12.     printf("\nAddress of a is %d",&a);
  13.     printf("\nAddress of b is %d",&b);
  14.     a=a+1;
  15.     b=b+1;
  16.     
  17. }
  18. //refer deliver
  19. void FucRefer(int &a,int &b)
  20. {
  21.     printf("\nAddress of a is %d",&a);
  22.     printf("\nAddress of b is %d",&b);
  23.     a=a+1;
  24.     b=b+1;
  25. }
  26.  
  27. int main(int argc,int argv[])
  28. {
  29.     int input1,input2,input3,input4;
  30.     printf("Please input two integer:");
  31.  
  32.     scanf("%d",&input1);
  33.     scanf("%d",&input2);
  34.     printf("\nAddress of input1 is %d",&input1);
  35.     printf("\nAddress of input2 is %d",&input2);
  36.     FucValue(input1,input2);
  37.     printf("\ninput1=%d\ninput2=%d",input1,input2);
  38.  
  39.     printf("\nPlease input two integer:");
  40.     scanf("%d",&input3);
  41.     scanf("%d",&input4);
  42.     printf("\nAddress of input1 is %d",&input3);
  43.     printf("\nAddress of input2 is %d",&input4);
  44.     FucRefer(input3,input4);
  45.     printf("\ninput1=%d\ninput2=%d",input3,input4);
  46.     
  47. }
相關文章
相關標籤/搜索