取自http://www.eskimo.com/~scs/cclass/int/sx8.html:
` 因为我们可以有指向 int 的指针,指向 char 的指针,以及指向我们定义的任何结构的指针,实际上指向 C 中的任何类型的指针,所以我们可以拥有指针也就不足为奇了到其他指针。如果我们习惯于考虑简单的指针,并在头脑中清楚指针本身和它所指向的内容之间的区别,那么我们也应该能够考虑指向指针的指针,尽管我们现在必须区分指针,它指向什么,以及它指向的指针指向什么。(当然,我们也可能最终得到指向指向指针的指针,或指向指向指针的指针的指针,尽管这些很快变得太深奥而没有任何实际用途。)指针指向指针的声明看起来像 int **ipp; 其中两个星号表示涉及两个级别的指针。从熟悉的、平淡无奇的幼儿园风格的例子开始,我们可以通过声明一些指向它的指针和一些指向这些指针的 int 来演示 ipp 的使用:
int i = 5, j = 6; k = 7;
int *ip1 = &i, *ip2 = &j;
现在我们可以设置
ipp = &ip1;
ipp 指向指向 i 的 ip1。*ipp 是 ip1 ,而 **ipp 是 i 或 5。
...
在实践中,指向指针的指针有什么用?一种用途是从函数返回指针,通过指针参数而不是作为正式的返回值。为了解释这一点,让我们先回过头来考虑通过指针参数从函数返回简单类型(例如 int)的情况。如果我们写函数
f(int *ip)
{
*ip = 5;
}
然后这样称呼它:
int i;
f(&i);
然后 f 将通过将值 5 写入调用者传递的指针指定的位置来返回值 5;在这种情况下,调用者的变量 i 。如果一个函数有多个要返回的东西,它可能会以这种方式返回值,因为一个函数只能有一个正式的返回值(也就是说,它只能通过 return 语句返回一个值。)需要注意的重要一点是为了让函数返回一个 int 类型的值,它使用了一个指向 int 的指针类型的参数。现在,假设一个函数想要以这种方式返回一个指针。相应的参数必须是指向指针的指针。例如,这是一个小函数,它尝试为长度为 n 的字符串分配内存,如果失败则返回零(false''),如果成功则返回 1(非零或 true''),
#include <stdlib.h>
int allocstr(int len, char **retptr)
{
char *p = malloc(len + 1); /* +1 for \0 */
if(p == NULL)
return 0;
*retptr = p;
return 1;
}
然后调用者可以做类似的事情
char *string = "Hello, world!";
char *copystr;
if(allocstr(strlen(string), ©str))
strcpy(copystr, string);
else fprintf(stderr, "out of memory\n");
(这是一个相当粗略的例子;allocstr 函数并不是非常有用。调用者直接调用 malloc 会很容易。另一种更有用的方法是围绕 malloc 编写包装函数以我们一直使用的 chkmalloc 函数为例。)`