什么是C++中的**?

ags*_*ala 38 c++ pointers

我已经看到了一些代码,以及我的编译器生成的一些错误,这些错误**在变量之前有一个' '标记(例如**变量名未引用 - 或者其他东西,我不能完全回想起来).我相当肯定这与指针有关,如果我不得不猜测它看起来像是试图取消引用两次.' **'是相当不容易的.有人能指出我一个好的网站/文档,或者有人会在这里解释一下吗?

谢谢.

很好的回应.如果我可以添加,那么指向指针的指针有什么用呢?你不应该只使用原始指针而不是创建另一个指向原始指针的指针吗?

Ant*_*ima 44

**实际上并不是指向指针的指针(如声明中所示),但也是取消引用(在语句中)的解除引用.

它经常在C中使用,它没有引用的符号,例如更新返回值,它是一个指针类型:

int alloc_foo(struct foo **foo_ret)
{
    *foo_ret = malloc(sizeof(struct foo));
    return 1; /* to indicate success; return value in foo_ret */
}
Run Code Online (Sandbox Code Playgroud)


Par*_*ppa 30

您可以识别main()的签名:

int main(int argc, char* argv[])
Run Code Online (Sandbox Code Playgroud)

以下是等效的:

int main(int argc, char** argv)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,argv是指向char*数组的指针.

在C中,索引运算符[]只是执行指针运算的另一种方式.例如,

foo[i]
Run Code Online (Sandbox Code Playgroud)

生成相同的代码

*(foo + i)
Run Code Online (Sandbox Code Playgroud)


Rob*_*edy 11

这不是一个**象征.它只是一个*令牌,后跟另一个*令牌.在你的情况下,你有一个指向指针的指针,它被解除引用两次以获得真正指向的东西.


Can*_*der 9

**是指向指针的指针.

它可能是一个矩阵(数组数组)或一个字符串数组(一个char数组)等.


Pau*_*ham 6

这是一个双重解除引用.

int i = 3;
int* ptr_to_i = &i;
int** ptr_to_ptr_to_i = &ptr_to_i;

std::cout << **ptr_to_ptr_to_i << std::endl;
Run Code Online (Sandbox Code Playgroud)

打印3.


BC.*_*BC. 5

你可以按字面意思理解——指向指针的指针


P D*_*ddy 5

我只是想强调指针指针的一些用法.其他职位触及了大部分内容,但我认为重申可能会有所帮助.

  • 它允许被调用者修改调用者拥有的指针.例如,可以将指针传递给指向字符串开头的指针,并且被调用者可以修改指向指针,现在指向字符串中发生特定字符的位置.

  • 因为数组会降级为指针(并且指针可以被视为数组),所以如果你有以下内容,通常会看到指向指针的指针:

    • 指向数组的指针.这是对上述情况的概括,因为"字符串"(无论如何都是C风格的字符串)实际上只是一个chars 数组.

    • 一个指针数组.例如,您可能有一个指向对象的指针数组,允许多态,或指针数组来选择存储在另一个集合中的对象.

    • 一组数组.同样,数组降级为指针,因此这是上述的特定情况.这通常用于所谓的"锯齿状"阵列(与矩形相对).