我正在做一个相对简单的任务,但我不了解它的更广泛的上下文/应用程序目的:
void ft_multipointer(int *********nbr)
{
*********nbr = 99;
}
- 在哪种情况下我可以使用/需要这么多指针?
- 术语
nbr
是强制性的还是我可以在那里写其他字母顺序?
谢谢!
-
通常您不需要那么多指针,但您可能想要传递指针或指针到指针。您还可以使用指针来解引用多维数据结构。
-
nbr只是变量名,您可以使用任何其他有效的字母和数字序列。
很少看到超过三层的间接(例如int ***nbr
)。我想不出有什么实际情况需要九个间接层次,但我的经验并不是那么广泛。
在几种情况下会出现多级间接性。首先是需要一个函数写入指针类型的形参。假设您有如下内容:
void foo( T *ptr ) // for any type T
{
*ptr = new_T_value(); // write a new value to the thing ptr points to
}
void bar( void )
{
T var;
foo( &var ); // write a new value to var
...
}
我们想让foo
更新var
的值——要做到这一点,我们必须传递一个指向var
的指针。现在让我们将T
替换为指针类型P *
:
void foo( P **ptr )
{
*ptr = new_Pstar_value(); // or **ptr = new_P_value(), assuming **ptr is valid
}
void bar( void )
{
P *var;
foo( &var );
...
}
的语义是完全相同的,所改变的只是我们想要更新的对象的类型。我们可以更进一步,用另一种指针类型Q *
:
P
:void foo( Q ***ptr )
{
*ptr = new_Qstarstar_value(); // or ***ptr = new_Q_value(), assuming ***ptr is valid
}
void bar( void )
{
Q **var;
foo( &var );
...
}
等等等等。快速检查语言定义似乎没有指出间接的最大级别,但我可能只是错过了它。当然,你做我做的事情不是为了好玩,你这样做是因为你真的在处理多层次的间接,不管出于什么原因。
当你处理多维数据时,多重间接也会出现。不是使用n维数组,而是动态分配内存——创建指向指针序列的指针,每个指针都指向指针序列,等等:/**
* Dynamically allocate space for an NxMxL array - error checking
* omitted for brevity.
*/
T ***p = malloc( N * sizeof *p ); // Allocates space for N objects of type T **
for ( size_t i = 0; i < N; i++ )
{
p[i] = malloc( M * sizeof *p[i] ); // Allocates space for M objects of type T *
for ( size_t j = 0; j < M; j++ )
p[i][j] = malloc( L * sizeof *p[i][j] ); // Allocates space for L objects of type T
}
给出了这样的结构:
T *** T ** T * T
+---+ +---+ +---+ +---+
p: | | ---> | | p[0] ---> | | p[0][0] -------> | | p[0][0][0]
+---+ +---+ +---+ +---+
| | p[1] -+ | | p[0][1] -----+ | | p[0][0][1]
+---+ | +---+ | +---+
... | ... | ...
| |
| +---+ | +---+
+-> | | p[1][0] ---+ +-> | | p[0][1][0]
+---+ | +---+
| | p[1][1] -+ | | | p[0][1][1]
+---+ | | +---+
... | | ...
| |
| | +---+
| +---> | | p[1][0][0]
| +---+
| | | p[1][0][1]
| +---+
| ...
|
| +---+
+-----> | | p[1][1][0]
+---+
| | p[1][1][1]
+---+
...
再一次,在我的经验中,我从来没有见过任何需要超过三个维度来存储的东西,但我的经验并不是那么广泛。可能有一些问题域,你真的有9个独立的数据维度(x = a[i][j][k][l][m][n][o][p][q];
),但我只是没有看到它。