指向指针的指针的现实用途?

时间:2015-02-06 13:17:39

标签: c++ c pointers

我在书中看到了示例代码,用于展示int*** ptrint ****ptr等指针。有哪些实际例子可供使用?

4 个答案:

答案 0 :(得分:8)

它们主要用于动态分配的多维数组。

示例:

int width = 100, height = 2, depth = 50;
int*** array3d;
array3d = new int**[width];
for (int x = 0; x < width; ++x) {
    array3d[x] = new int*[height];
    for (int y = 0; y < height; ++y) {
        array3d[x][y] = new int[depth];
    }
}

// Now array3d can be used like this:
array3d[42][0][1] = 666;

答案 1 :(得分:4)

这样的指针极少使用,我愿意打赌,在绝大多数使用它们的情况下,可以通过重构代码使其更简单来避免它们。 (而且更容易理解和更易于维护。)

然而,指针(* p)和指针(** p)的指针非常常见,这意味着语言必须提供至少声明那些的能力,所以绝对没有理由设置任意限制在两个间接层面上,禁止任何人宣布任何更多层次的间接。

答案 2 :(得分:1)

我用过的最多的是char***

我正在解析一个文件,并且必须按行分隔。

所以你有:

char*** parsed_file;
char** first_line = parsed_file[0];
char* first_word_of_first_line = first_line[0];

答案 3 :(得分:1)

另一个会遇到多个间接层的地方是需要函数写入指针参数时。假设以下代码:

void bar( T *arg )
{
  *arg = new_value(); // write new value to what arg points to
}

void foo( void )
{
  T x;
  bar (&x);  // write new value to x
}

用指针类型T替换Q *

void bar( Q **arg )
{
  *arg = new_value(); // write new value to what arg points to
}

void foo( void )
{
  Q *x;
  bar (&x);  // write new value to x
}

用另一个指针类型Q代替R *

void bar( R ***arg )
{
  *arg = new_value(); // write new value to what arg points to
}

void foo( void )
{
  R **x;
  bar (&x);  // write new value to x
}
等等,等等。

三种情况下的语义相同;我们正在为x写一个新值。唯一改变的是x的类型和间接级别的数量。