指向指针的指针

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);

你可能感兴趣的:(指向指针的指针)