1. 傳參是一個指針
int m_value = 1;
void func(int *p) {
p = &m_value;
}
int main(int argc, char const *argv[])
{
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(pn);
cout << *pn << endl;
return 0;
}
輸出:
2
2
當我們把一個指針作為參數傳給一個方法時,其實是把指針的副本傳給了方法,也就是指針的值傳遞。因此,如果我們在方法的內部修改指針本身的值,那么我們改的只是副本的值而已,而不是原來的指針本身,原來的指針還保留著原來的值。
2. 使用指針的指針
void func(int **p) {
*p = new int;
**p = 5;
}
int main(int argc, char const *argv[])
{
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(&pn);
cout << *pn << endl;
return 0;
}
輸出
2
5
上面代碼將 func
改為了接收參數為指向指針的指針。因此,當我們進行解指針賦值 *p = new int
時,其實改變的就是指針 *p
本身的值。
為什么需要使用指向指針的指針?
有時候,我們的函數有一個表示結果碼的返回值,同時,函數也希望返回一個由這個函數生成的數據結構。也就是說,這個函數可能希望返回兩種類型的數據。這時,我們就可以用 指向指針的指針。
int ANeuralNetworksExecution_create(ANeuralNetworksCompilation* compilation,
ANeuralNetworksExecution** execution);
第二個參數 execution
就是一個指向 ANeuralNetworksExecution*
的指針,函數可以像上面例子中一樣,修改 ANeuralNetworksExecution*
本身,為其賦值一個新的數據。從而,當函數調用時,傳入的是一個指向空的 ANeuralNetworksExecution*
指針。當函數返回時,調用者就得到了一個指向 ANeuralNetworksExecution
對象的指針。
調用者代碼如下:
ANeuralNetworksExecution *execution;
int32_t status = ANeuralNetworksExecution_create(compilation_, &execution);