当前位置:  开发笔记 > 编程语言 > 正文

在C++中使用多个间接是什么用途?

如何解决《在C++中使用多个间接是什么用途?》经验,为你挑选了3个好方法。

在什么情况下你可能想Foo **在C++中使用多个间接(即指针链)?



1> Jorge Ferrei..:

@aku指出的最常见用法是允许在函数返回后更改指针参数.

#include 

using namespace std;

struct Foo {
    int a;
};

void CreateFoo(Foo** p) {
    *p = new Foo();
    (*p)->a = 12;
}

int main(int argc, char* argv[])
{
    Foo* p = NULL;
    CreateFoo(&p);
    cout << p->a << endl;
    delete p;
    return 0;
}

这将打印

12

但是在下面的示例中还有其他一些有用的用法,用于迭代字符串数组并将它们打印到标准输出.

#include 

using namespace std;

int main(int argc, char* argv[])
{
    const char* words[] = { "first", "second", NULL };
    for (const char** p = words; *p != NULL; ++p) {
        cout << *p << endl;
    }

    return 0;
}



2> aku..:

IMO最常见的用法是传递对指针变量的引用

void test(int ** var)
{
 ...
}

int *foo = ...
test(&foo);

您可以使用双指针创建多维锯齿状数组:

int ** array = new *int[2];
array[0] = new int[2];
array[1] = new int[3];



3> John B..:

一种常见的情况是,您需要将指针传递给函数,并在该函数内初始化,并在函数外部使用.没有multplie间接,调用函数永远不会访问初始化对象.

考虑以下功能:

initialize(foo* my_foo)
{
    my_foo = new Foo();
}

任何调用'initialize(foo*)'的函数都无法访问Foo的初始化实例,因为传递给该函数的指针是一个副本.(毕竟,指针只是一个整数,整数按值传递.)

但是,如果函数定义如下:

initialize(foo** my_foo)
{
    *my_foo = new Foo();
}

......这就是这样叫的......

Foo* my_foo;

initialize(&my_foo);

...然后调用者可以通过'my_foo'访问初始化的实例 - 因为它是传递给'initialize'的指针的地址.

当然,在我的简化示例中,'initialize'函数可以通过return关键字简单地返回新创建的实例,但这并不总是适合 - 可能函数需要返回其他内容.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有