char **x ポインタはそれ自体変数であり,int * や char * が型(タイプ)を意味し,
char *p;
といった宣言(型 変数名;)によってポインタの値を格納するためのアドレスも確定します。すなわち,ポインタにも値(アドレス番号)を格納するためのアドレスが割り振られている訳です。ポインタのアドレスを変数にもつポインタが「ポインタへのポインタ」です。
/* Example 10.12 */
#include <stdio.h>
int main(void)
{
char x[] = "testing";
char *p;
char **z;
printf(" x = %p\n", x);
p = x;
printf(" p = %p, &p = %p\n", p, &p);
z = &p;
printf("*z = %p, z = %p\n", *z, z);
return 0;
}
この例では,z がポインタへのポインタです。z にポインタ p のアドレスを代入している様子から見ても,ポインタのアドレスを変数にもつ変数であることが理解できるかと思います。実行結果は次の通りです。
x = 0xbffffa68 p = 0xbffffa68, &p = 0xbffffa70 *z = 0xbffffa68, z = 0xbffffa70
z = &p ですので,アドレス演算子と間接演算子の文法より,*z == p です。