我在C here中看到了关于**(指向指针的指针)的问题。我想知道这是什么意思?我什么时候应该使用它?
答案 0 :(得分:7)
每当你需要一个指向指针的指针时:)。
例如,如果要动态分配指针数组,operator new或malloc将返回指向数组中第一个指针的指针。
其他用途可能是将指针传递给函数,因此该函数可以修改原始指针。在C ++中,您可以通过引用传递,但不能传递给C。
答案 1 :(得分:5)
当你有一个想要增加指向c字符串的指针的函数时。这对于像递归下降解析器这样的事情是必需的,其中每个规则负责递增事物......
答案 2 :(得分:3)
在某些变体中:
void PutNewObjectHere(Class **dp) {
*dp = new Class;
}
Class *p;
PutNewObjectHere(&p);
delete p;
(注意,这是一个愚蠢的例子。它通常会返回新指针。然而,这个概念偶尔会出现在实践中)
答案 3 :(得分:2)
它通常用于输出指针的参数,例如:
bool GetSomeObject(SomeObject** object) {
*object = new SomeObject();
// ... initialize object or whatever ...
}
你会这样称呼它:
SomeObject* object;
if (GetSomeObject(&object)) {
// ... use object ...
delete object;
}
这是被调用者分配并且调用者释放的常见模式......
答案 4 :(得分:2)
你想要一个C函数来改变作为参数传递的指针,并且它是C所以没有传递引用。因此,您传递指针指针。以下是改编自Dave Hanson C Interfaces and Implementations的最佳例子:
void Bit_free(struct Bit_T **set) {
assert(set && *set);
free(*set);
*set = NULL;
}
通过将NULL
写入释放的指针,可以防止它悬空。
答案 5 :(得分:1)
这称为双重间接,这意味着您有一个指向另一个指针的指针,该指针又指向一些有用的数据(或者在极少数情况下指向另一个指针)。
Wikipedia上有一篇很好的文章,它涵盖了一般的指针,并且在双重间接方面有一个很好的部分。
答案 6 :(得分:0)
特别是我在数组的上下文中使用了这些指针。例如,在我的8086模拟器项目中,我有一个函数指针数组。所以最终看起来像这样:
instruction_functions[(int)opcode]();
这也称为跳转表(sorta),并且在很多地方用于优化目的。