**
'标记(例如 **variablename unreferenced--或其他什么,我不记得具体是什么了)。 我相当确定这与指针有关,如果我猜测它看起来像是尝试进行两次解引用。 '**
'相当难搜索。 有人能给我指向一个好的网站/文档,或者在这里解释一下吗?谢谢。
很好的回答。 如果我可以补充一点,有哪些情况下将指针指向指针会很有用?你不应该只使用原始指针而不是创建另一个指向原始指针的指针吗?
**
'标记(例如 **variablename unreferenced--或其他什么,我不记得具体是什么了)。 我相当确定这与指针有关,如果我猜测它看起来像是尝试进行两次解引用。 '**
'相当难搜索。 有人能给我指向一个好的网站/文档,或者在这里解释一下吗?**
实际上不仅仅是指针到指针(在声明中),而且也可以表示对两次解引用的结果(在语句中)。
在C语言中经常使用它,因为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
数组。
指针数组。例如,你可以有一个指向对象的指针数组,允许多态性,或者一个指向存储在另一个集合中选择的对象的指针数组。
数组的数组。同样,数组退化为指针,因此这是上述情况的具体情况。这经常用于所谓的“不规则”数组(与矩形数组相对)。
int **var
声明一个指向指针的指针**var
引用指向指针的指针所指向的指针的内容一个常见的用途是允许函数将指针设置为null。
因此,free(pointer)会释放分配给指针的内存,但会使指针危险地指向空闲内存。
相反,声明一个my_free(**pointer),并调用my_free(&pointer),这样my_free()在释放内存后可以将指针设置为null。