指向指針的指針

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);
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 還是第一次遇到需要使用指針的指針的情況,可能是代碼敲得少了吧,于是記錄下來 實際的需求是A文件需要用到的B文件中一...
    lissettecarlr閱讀 472評論 0 0
  • 指針也是變量,只不過存儲的是內存地址而已,所以可以像普通變量一樣存儲在數組中。例子里的聲明:char linept...
    Hy_Slin閱讀 159評論 0 0
  • 在看數據結構的鏈表一章時,一直對于鏈表表頭這個知識點比較迷惑。 下面是鏈表的末尾添加一個節點的函數原型,為什么第一...
    叁璋閱讀 3,601評論 1 3
  • 函數傳參是將參數的值拷貝一份,放在在棧中分配的內存中。 將二級指針作為參數傳遞,是為了改變一級指針的指向。 ps:...
    陳_振閱讀 212評論 0 0
  • 黑色的海島上懸著一輪又大又圓的明月,毫不嫌棄地把溫柔的月色照在這寸草不生的小島上。一個少年白衣白發,悠閑自如地倚坐...
    小水Vivian閱讀 3,130評論 1 5