2010-10-08 40 views
0

「雙指針有時也用於通過引用傳遞指向函數的指針」 有人可以向我解釋上述語句,指向通過引用方式?雙指針有時也用於通過引用來傳遞指向函數的指針

+2

可能有助於獲得更多的上下文。你能否提供該報價的鏈接? – JaredPar 2010-10-08 05:55:25

+0

[http://stackoverflow.com/questions/2570447/why-we-used-double-and-triple-pointer-in-objective-c-or-c-language]第一個答案 – Tony 2010-10-08 05:56:27

回答

4

我相信這個例子使得它更清晰:

+0

您的示例不需要雙指針,也不使用函數指針。 – 2010-10-08 06:38:59

+0

這只是爲了說明雙指針如何工作。這個問題不是關於函數指針的,因此它不會涵蓋它。 – Naveen 2010-10-08 06:39:48

+0

對不起,我誤解了這個問題。如果你稍微編輯你的答案,我可以取消我的-1,否則它說我的投票被鎖定在:( – 2010-10-08 07:00:22

2

這意味着你有一個函數需要一個指針指針(例如輸入int **)。這允許你修改指針(指向哪個數據)的方式,通過引用指針允許傳遞指針。

void change (int *p) {*p = 7;} 
void Really_Change (int **pp) {*pp = null;} 

int p = 1; 
int *pp = &p; 
// now, pp is pointing to p. Let's say it has address 0x10; 

// this makes a copy of the address of p. The value of &p is still 0x10 (points to p). 
// but, it uses that address to change p to 7. 
change(&p); 
printf("%d\n", p); // prints 7; 


// this call gets the address of pp. It can change pp's value 
// much like p was changed above. 
Really_Change(&pp); 

// pp has been set to null, much like p was set to 7. 

printf("%d\n", *pp); // error dereference null. Ka-BOOM!!! 

所以,你可以傳遞一個指向int並更改該值以同樣的方式,你可以傳遞一個指針的指針並改變其值(改變它所指向。)

+0

只是爲了澄清英語語法...沒有指向函數的指針;該函數是接收指向任意類型指針的指針。 – Potatoswatter 2010-10-08 06:01:21

+0

'cout << * pp << endl; //打印1;' 我認爲它會打印'7'。 – Hemant 2010-10-08 06:44:19

+0

@Hemant:是的,我想我錯過了編輯。謝謝。 – JoshD 2010-10-08 06:47:02

1

我會嘗試用代碼和簡單的英語:)來解釋。解釋可能會很長,但這將是值得的。

假設我們有一個程序,運行它的main()函數,然後我們調用另一個需要參數int的函數。

從概念上講,當你將一個變量作爲參數傳遞給一個函數時,你可以這樣做(粗略地說)兩種方式:按值或通過引用。

「按值」是指給函數一個變量的副本。該函數將接收其「內容」(值),但它不能將實際變量更改到其自己的代碼體外,因爲它只有一個副本。

另一方面,「通過引用」意味着給函數提供變量的實際內存地址。使用它,函數可以找出變量的值,但它也可以到達指定的地址並修改變量的內容。

在我們的C程序中,「按值」意味着通過int的副本(僅以int作爲參數),「通過引用」表示將指針傳遞給它。

讓我們看到一個小的代碼示例:

void foo(int n) { 
    n = 10; 
    printf("%d\n", n); 
} 

int main() { 
    int n = 5; 

    foo(n); 
    printf("%d\n", n); 

    return 0; 
} 

什麼將這個程序的輸出是什麼? 10 10?不。 10 5!因爲我們通過了int的副本,按價值而不是參照,foo()只修改了存儲在其副本中的號碼,無法達到main()的副本。現在

,如果我們這樣來做:

void foo(int* n) { 
    *n = 10; 
    printf("%d\n", *n); 
} 

int main() { 
    int n = 5; 
    foo(&n); 
    printf("%d\n", n); 

    return 0; 
} 

這次我們引用了foo()我們的整數:它是實際的內存地址。 foo()具有完全的權力,通過訪問它在內存中的位置來修改它,foo()main()正在使用相同的副本,因此輸出將是10 10

正如你所看到的,指針是一個引用,... ,但也是一個在內存中的數字位置。它類似於int,只有內部包含的數字被解釋爲不同。想想這樣:當我們通過引用傳遞int時,我們通過值傳遞一個int指針!。因此,值/參考邏輯可以應用於指針,即使它們已經是引用。

如果我們的實際的變量不是一個整數,而是一個int引用(指針),我們希望main()foo()共享該引用,以便foo()可以modifiy它的同一個副本,我們該怎麼辦?爲什麼當然,我們需要參考我們的參考!指向指針的指針。那就是:

int n; /* integer */ 
int* n; /* integer reference(pointer). Stores an int's position in memory */ 
int** n; /* reference to integer reference, or double pointer. 
      Stores int*'s memory address so we can pass int*s by reference. */ 

我希望這很有用。