我在书中看到了示例代码,用于展示int*** ptr
,int ****ptr
等指针。有哪些实际例子可供使用?
答案 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
的类型和间接级别的数量。