6
typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine

今度ptr1は型const char*であり、したがって非定数ポインターである必要がありますが、なぜそれが定数ポインターとして扱われるのですか?

4

4 に答える 4

13

それらは同じではありません。

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して結合*し、アトムを形成します。

于 2012-08-08T12:55:17.560 に答える
3

ptr1は aconst (char *)で、ポインター自体が const であることを意味します。一方、ptr2is a(const char) *は、ポインターのターゲットが const であることを意味します。

于 2012-08-08T12:55:53.070 に答える
0

c が物事を内部的にグループ化する方法に関係しています。typedef はマクロのようなものではありません。単に何かを代入するだけではありません。括弧を入れると、次のようになります。

const (char*) ptr1 = "pointer";
(const char)* ptr2 = "pointer";
于 2012-08-08T12:56:50.663 に答える
0

次のように書きます。

typedef char* c;
c const ptr1 = "pointer";
++ptr1; /// error
char const* ptr2 = "pointer";
++ptr2; /// runs fine

違いがより目に見えるようになり、これはあなたの例と同じになるはずです

于 2012-08-08T13:00:52.377 に答える