哪些情况有用?

时间:2010-05-23 21:05:34

标签: c++ c reference

  

可能重复:
  Uses for multiple levels of pointer dereferences?

我在C here中看到了关于**(指向指针的指针)的问题。我想知道这是什么意思?我什么时候应该使用它?

7 个答案:

答案 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),并且在很多地方用于优化目的。