我知道當我們傳遞一個參數給函數時,函數的堆棧中創建了一個副本,並且調用者函數中參數的實際值沒有變化。在C中傳遞參考時發生了什麼?
將指針傳遞給函數會發生什麼?我知道參數的值在調用者函數中發生了變化。但是內部是如何發生的呢?被調用函數如何訪問調用者函數中的變量?
我試圖從Call_by_reference page in wikipeidia獲得信息,但不是實質性的。
一旦我開始閱讀有關字符串並將字符串作爲參數傳遞給其他函數,我很困惑。任何有關這方面的幫助將是很大的幫助。謝謝!!!!
我知道當我們傳遞一個參數給函數時,函數的堆棧中創建了一個副本,並且調用者函數中參數的實際值沒有變化。在C中傳遞參考時發生了什麼?
將指針傳遞給函數會發生什麼?我知道參數的值在調用者函數中發生了變化。但是內部是如何發生的呢?被調用函數如何訪問調用者函數中的變量?
我試圖從Call_by_reference page in wikipeidia獲得信息,但不是實質性的。
一旦我開始閱讀有關字符串並將字符串作爲參數傳遞給其他函數,我很困惑。任何有關這方面的幫助將是很大的幫助。謝謝!!!!
當您將指針傳遞給函數時,指針會被複制。但是,指向對象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
。使用指針算術,您可以獲得以下元素。
所有的數據都存儲在一個特定的地址與特定的地址。當通過引用傳遞時,通過引用傳遞數據的地址。並告訴函數使用間接尋址來操縱數據。
當您將它傳遞給函數時,(變量的)地址作爲數據發送,但數據本身是按值傳遞的。
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
用C的每個參數值傳遞。
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.
用實例編寫而不是實際的代碼。希望你得到它 – Omkant