因为我们在像
这样的函数的参数列表中使用指针void f(int *);
这意味着此函数将接收指向整数的指针 但这意味着什么
void f(int ***);
和
void f(int **=0)
答案 0 :(得分:15)
void f(int ***);
表示函数接收指向指向int的指针的指针。这适用于它:
int x=42;
int *px=&x;
int **ppx=&px;
int ***pppx=&ppx;
f(pppx);
现在关于第二个,它是一个接收指向int的指针的函数,如果你什么都不给它,它默认为0。
int x=42;
int *px=&x;
int **ppx=&px;
f(ppx); // pt to pt to x
f(); // same as f(0)
更新:
这种双指针的实际应用是内存分配例程,如:
bool alloc(T **mem, int count);
此函数返回true
/ false
,具体取决于它是否有效,并将使用实际内存地址更新传入的指针,如下所示:
T *mem;
verify(alloc(&mem, 100));
您传入一个未初始化的指针,该函数可以用实际值覆盖它,因为您传递了指向实际指针的指针。最后,mem
包含指向有效内存的指针。
另一个应用程序,更常见但很少启发,是一个数组(所谓的锯齿状数组)。
答案 1 :(得分:5)
int ***
是指向指向int 的指针的指针。可以将其视为(((int*)*)*)
。
void f(int **=0)
此函数将指向int指针的指针作为参数,但也可以在不带参数的情况下调用,在这种情况下,参数将为0。
答案 2 :(得分:4)
void f(int ***);
此处f
采用指向指向int
的指针的指针。
void f(int **=0)
此函数将指向int
的指针作为参数,但此参数是可选的,默认值为0(即null)
答案 3 :(得分:1)
void f(int ***);
这里的函数参数是一个指向指向int的指针的指针(或者更可能指向其中的许多指针)。
void f(int **=0)
这里只是一个指向int的指针,如果在调用函数时未指定参数,则初始化为0的指针(指向...的指针为0,而不是int)(可选参数) )。
答案 4 :(得分:1)
您要问的是Multiple Indirection。那页很好地总结了这个问题,我强烈建议在指针上阅读整个页面,这是很好的。
答案 5 :(得分:-3)
void f(int ***);
正如其他答案所解释的那样,这是一个指向指向int的指针的指针。它告诉我,程序员不是一个非常优秀的程序员 - 他(并且几乎可以肯定是他)太忙于炫耀他有多聪明,有3级间接考虑难以保持像这样的过于模糊的代码。在C和C ++编程的大约20年中,我从未使用过3级间接,很少使用2.