インタビューで聞かれました。右から左に読むという考えのように、私は解釈できます
char *const *p declares p as pointer to constant pointer of character.
その間
char * *const p declares p as a constant pointer to character pointer.
しかし、これらの正確な意味がわからなかったので、確認してください。
char * const *p
を指す文字ポインタはp
変更できないことを意味します。
char arr[] = "";
char *ptr = arr;
char * const *p = &ptr;
**p = '\0'; // ok
*p = 0; // error
p = 0; // ok
char ** const p
p
変更できないことを意味します。
char arr[] = "";
char *ptr = arr;
char ** const p = &ptr;
**p = '\0'; // ok
p = 0; // error
*p = 0; // ok, ptr is now NULL
cdeclを発見するまで、C で複雑なポインターを宣言するときに画面に頭をぶつけていました:)
char *const *p // -> declare p as pointer to const pointer to char
char * *const p // -> declare p as const pointer to pointer to char
インストールすることもできます。
乾杯!
次のコードを使用してこれをテストしました。
main()
{
char *const *p;
char **const q;
**p = 'a';
*p = *q;
p = q;
**q = 'a';
*q = *p;
q = p;
}
GCC は 7 行目と 12 行目、つまり*p = *q
とq = p
. だからあなたは正しいようです。*p
一定、q
一定です。
(はい、初期化されていないポインターを逆参照しているため、プログラムの動作が未定義であることはわかっています。それはほとんど問題ではありません。