指针指向指针的实际用途?
Realistic uses for pointer to pointer to pointer?
我在书中看到了演示指针的示例代码,例如 int*** ptr
、int ****ptr
等。可以使用哪些现实生活示例?
它们主要用于动态分配的多维数组。
示例:
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;
我用的最多的是char***
.
我正在解析一个文件,不得不将它分成每行的单词。
所以你有:
char*** parsed_file;
char** first_line = parsed_file[0];
char* first_word_of_first_line = first_line[0];
这样的指针极少使用,我敢打赌,在绝大多数使用它们的情况下,可以通过重构代码使其更简单来避免它们。 (而且更易于理解和维护。)
但是,指针 (*p) 和指向指针的指针 (**p) 很常见,这意味着该语言必须提供至少声明这些的能力,因此绝对没有理由放置一个任意限制两个间接级别,并禁止任何人声明任何更多级别的间接。
您将 运行 进入多级间接寻址的另一个地方是当您需要一个函数来写入指针参数时。假设以下代码:
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
}
用指针类型Q *
代替T
:
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
的类型和间接级别的数量。
我在书中看到了演示指针的示例代码,例如 int*** ptr
、int ****ptr
等。可以使用哪些现实生活示例?
它们主要用于动态分配的多维数组。
示例:
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;
我用的最多的是char***
.
我正在解析一个文件,不得不将它分成每行的单词。
所以你有:
char*** parsed_file;
char** first_line = parsed_file[0];
char* first_word_of_first_line = first_line[0];
这样的指针极少使用,我敢打赌,在绝大多数使用它们的情况下,可以通过重构代码使其更简单来避免它们。 (而且更易于理解和维护。)
但是,指针 (*p) 和指向指针的指针 (**p) 很常见,这意味着该语言必须提供至少声明这些的能力,因此绝对没有理由放置一个任意限制两个间接级别,并禁止任何人声明任何更多级别的间接。
您将 运行 进入多级间接寻址的另一个地方是当您需要一个函数来写入指针参数时。假设以下代码:
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
}
用指针类型Q *
代替T
:
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
的类型和间接级别的数量。