我已经看到了一些代码,以及我的编译器生成的一些错误,这些错误**
在变量之前有一个' '标记(例如**变量名未引用 - 或者其他东西,我不能完全回想起来).我相当肯定这与指针有关,如果我不得不猜测它看起来像是试图取消引用两次.' **
'是相当不容易的.有人能指出我一个好的网站/文档,或者有人会在这里解释一下吗?
谢谢.
很好的回应.如果我可以添加,那么指向指针的指针有什么用呢?你不应该只使用原始指针而不是创建另一个指向原始指针的指针吗?
**实际上并不是指向指针的指针(如声明中所示),但也是取消引用(在语句中)的解除引用.
它经常在C中使用,它没有引用的符号,例如更新返回值,它是一个指针类型:
int alloc_foo(struct foo **foo_ret) { *foo_ret = malloc(sizeof(struct foo)); return 1; /* to indicate success; return value in foo_ret */ }
您可以识别main()的签名:
int main(int argc, char* argv[])
以下是等效的:
int main(int argc, char** argv)
在这种情况下,argv是指向char*数组的指针.
在C中,索引运算符[]只是执行指针运算的另一种方式.例如,
foo[i]
生成相同的代码
*(foo + i)
这不是一个**
象征.它只是一个*
令牌,后跟另一个*
令牌.在你的情况下,你有一个指向指针的指针,它被解除引用两次以获得真正指向的东西.
**是指向指针的指针.
它可能是一个矩阵(数组数组)或一个字符串数组(一个char数组)等.
这是一个双重解除引用.
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;
打印3.
我只是想强调指针指针的一些用法.其他职位也触及了大部分内容,但我认为重申可能会有所帮助.
它允许被调用者修改调用者拥有的指针.例如,可以将指针传递给指向字符串开头的指针,并且被调用者可以修改指向指针,现在指向字符串中发生特定字符的位置.
因为数组会降级为指针(并且指针可以被视为数组),所以如果你有以下内容,通常会看到指向指针的指针:
指向数组的指针.这是对上述情况的概括,因为"字符串"(无论如何都是C风格的字符串)实际上只是一个char
s 数组.
一个指针数组.例如,您可能有一个指向对象的指针数组,允许多态,或指针数组来选择存储在另一个集合中的对象.
一组数组.同样,数组降级为指针,因此这是上述的特定情况.这通常用于所谓的"锯齿状"阵列(与矩形相对).