C++ の ** とは何ですか?

** は実際には (宣言のように) ポインターへのポインターであるだけでなく、(ステートメントの中で) 逆参照の逆参照でもあります。

これは、参照用の &表記がない C でよく使用されます。ポインター型の戻り値を更新するには:

int alloc_foo(struct foo **foo_ret)
{
    *foo_ret = malloc(sizeof(struct foo));
    return 1; /* to indicate success; return value in foo_ret */
}

main() の署名に気付くかもしれません:

int main(int argc, char* argv[])

以下は同等です:

int main(int argc, char** argv)

この場合、argv は char* の配列へのポインターです。

C では、インデックス演算子 [] は、ポインター演算を実行するもう 1 つの方法です。たとえば、

foo[i]

と同じコードを生成します

*(foo + i)

** ではありません トークン。単純に * です トークンの後に別の * が続く トークン。あなたの場合、ポインターへのポインターがあり、実際に指されているものを取得するために 2 回逆参照されています。