指向指针的指针

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阅读 3,315评论 0 0
  • 指针也是变量,只不过存储的是内存地址而已,所以可以像普通变量一样存储在数组中。例子里的声明:char linept...
    Hy_Slin阅读 1,046评论 0 0
  • 在看数据结构的链表一章时,一直对于链表表头这个知识点比较迷惑。 下面是链表的末尾添加一个节点的函数原型,为什么第一...
    叁璋阅读 8,962评论 1 3
  • 函数传参是将参数的值拷贝一份,放在在栈中分配的内存中。 将二级指针作为参数传递,是为了改变一级指针的指向。 ps:...
    陈_振阅读 1,397评论 0 0
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 9,768评论 0 13