2012-10-18 74 views
5

我知道當我們傳遞一個參數給函數時,函數的堆棧中創建了一個副本,並且調用者函數中參數的實際值沒有變化。在C中傳遞參考時發生了什麼?

將指針傳遞給函數會發生什麼?我知道參數的值在調用者函數中發生了變化。但是內部是如何發生的呢?被調用函數如何訪問調用者函數中的變量?

我試圖從Call_by_reference page in wikipeidia獲得信息,但不是實質性的。

一旦我開始閱讀有關字符串並將字符串作爲參數傳遞給其他函數,我很困惑。任何有關這方面的幫助將是很大的幫助。謝謝!!!!

回答

9

當您將指針傳遞給函數時,指針會被複制。但是,指向對象x的指針的副本也是指向x的指針,因此它可用於修改x

對於(做作)類比,假設x是你的房子。按照C的規則,當你需要一個水管工來修理你房子裏的東西時,你可以通過水管工一份房子的副本,讓他們解決這個問題,然後把副本交給你。不用說,對於大於幾個字節的房屋來說,由於所有的複製都是非常低效的。相反,你給水暖工指出你的房子(地址),這樣水管工就可以進入你的房子並在現場修理。這就是通過引用來引用的內容:您不傳遞要修改的數據,而是傳遞該數據的指針,以便被調用者知道在哪個位置上運行,而不是僅在上運行,其值爲

const int broken = 0, fixed = 1; 

struct House { 
    int plumbing; 
}; 

void plumber(House *h) 
{ 
    h->plumbing = fixed; 
} 

int main() 
{ 
    struct House h; 
    h.plumbing = broken; 
    plumber(&h);   // give the plumber the address of the house, 
          // not a copy of the house 
    assert(h.plumbing == fixed); 
} 

在傳遞字符串的情況下,你傳遞的是一個指向字符串中的第char。使用指針算術,您可以獲得以下元素。

3

所有的數據都存儲在一個特定的地址與特定的地址。當通過引用傳遞時,通過引用傳遞數據的地址。並告訴函數使用間接尋址來操縱數據。

當您將它傳遞給函數時,(變量的)地址作爲數據發送,但數據本身是按值傳遞的。

4

C沒有通過引用。當你將一個指針傳遞給一個函數時,實際上是將一個變量的地址傳遞給該函數。然後該函數可以更改該地址的值,然後該更改將反映在調用函數中的變量中。但是,如果您嘗試更改指針指向的地址,則更改將不會反映在調用函數中,因爲指針仍然按值傳遞。

void f(int *j) { 
    (*j)++; 
    int k = 20; 
    j = &k; 
} 

int main() { 
    int i = 20; 
    int *p = &i; 
    printf("i = %d, p = %p\n", i, p); 
    f(p); 
    printf("i = %d, p = %p\n", i, p); 

    return 0; 
} 

輸出

i = 20, p = 0x123456 
i = 21, p = 0x123456 
3
     a=10  b=20 
         ------ ------- 
         0xf8  0Xf4 
        ---------- --------- 

       Suppose a and b are two variables in a function stack 
       when you call another function 
       foo(&a,&b) 
       actually 0xf8 and 0xf4 is caught in the definition of 
       foo(int *pa,int *pb) 

     So pa=0xf8 pb=0xf4 
      -------- --------- 
But *pa = 10 and *pb = 20 , You can manipulate like this. 
So these pointers start pointing to the actual data and any changes here are reflected in the original environment. 
+0

用實例編寫而不是實際的代碼。希望你得到它 – Omkant