2015-02-12 160 views
1

傳遞指針地址作爲參數的意義何在?例如:傳遞指針地址作爲參數

int *ptr_one; 
ptr_one = (int *)malloc(sizeof(int)); 

然後函數被調用爲以下:

func(&ptr_one); 

注意該函數的參數是如下:

func(int **ptr) 
{ 
...... 
} 
+5

對於許多示例之一,當您傳遞{anything}的地址時,該函數可能會修改調用者的{anything}。這種做法(和你的代碼)比C++更C。 – 2015-02-12 00:24:11

+0

一個典型的例子是當你添加一個元素到一個列表中時,你需要傳遞它的'head'(指針)並且能夠修改它。使用單個指針是一個非常常見的錯誤,會產生很多令人頭疼的問題。但是要走的路是C++引用,即通過引用傳遞指針,如'func(int *&ptr)' – vsoftco 2015-02-12 00:31:43

+0

在現代C++中,我們很少需要指針,所以傳遞它們(無論如何)很難開始用。 – MSalters 2015-02-12 11:30:37

回答

2

如果你想修改指針本身,那麼你需要通過引用或指針地址來傳遞它。例如,

func(int **ptr) 
{ 
    free(ptr); 

    ptr = new int[2]; //side note: use new instead of malloc in C++ 
         //memory allocated with new is deallocated with 
         //delete 
} 

在C語言中,傳遞指針的地址是你能分配或釋放該指針的內存功能的唯一途徑。然而,在C++中,通過引用傳遞通常會更好。因此,C++版本的代碼如下所示:

int *ptr = new int; 
func(ptr); 
delete ptr; 

void func(int *&ptr) { 
. 
. 
. 
} 
+0

我的指針指向一個條目列表,每次我調用它時,函數都會不斷修改指針的頭部。我想這就是你自己修改指針的意思。對 ? – Anas 2015-02-12 00:42:28

+0

@Anas:是的。如果你只傳入'head',那麼指針在調用代碼中就不會改變,只是在函數中。 – wolfPack88 2015-02-12 00:44:26

2

指針傳遞到指針的目的是這樣的,指針變量可以被修改。

回想一下,從C風格的編碼,可以通過傳遞參數的地址或指針來修改參數。如果該參數是一個需要修改的int,則傳遞一個指向該整數的指針。同樣,如果函數將修改指針參數,它將通過指向指針(或指針地址)的指針傳遞。