typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine
今度ptr1
は型const char*
であり、したがって非定数ポインターである必要がありますが、なぜそれが定数ポインターとして扱われるのですか?
それらは同じではありません。
1つ目はconst-pointer-to-charを指定し、2つ目はpointer-to-const-charを指定します。
右から左に読んでみてください:
const char *p; // p is a pointer to char which is const
char const *p; // p is a pointer to const char (same as previous)
char * const p; // p is a const pointer to char
char const * const p; // p is a const pointer to const char
typedeftypedef char* c
を使用することで、「charへのポインタ」という意味を単一のエイリアスにパックしますc
。
const c p; // p is a const [c] --> p is a const [pointer to char]
追加の説明:
Typedefは、マクロのようにインプレース拡張されていません。
const c p;
本当になる
const [char*] p;
なりません
const char* p; // Nope.
頭の中でマクロのように展開しないでください。typedefを使用すると、バインドchar
して結合*
し、アトムを形成します。
ptr1
は aconst (char *)
で、ポインター自体が const であることを意味します。一方、ptr2
is a(const char) *
は、ポインターのターゲットが const であることを意味します。
c が物事を内部的にグループ化する方法に関係しています。typedef はマクロのようなものではありません。単に何かを代入するだけではありません。括弧を入れると、次のようになります。
const (char*) ptr1 = "pointer";
(const char)* ptr2 = "pointer";
次のように書きます。
typedef char* c;
c const ptr1 = "pointer";
++ptr1; /// error
char const* ptr2 = "pointer";
++ptr2; /// runs fine
違いがより目に見えるようになり、これはあなたの例と同じになるはずです