2

(p.11506) に記載されている C99 仕様 (N1256.pdf) を見ていました。

const int *ptr_to_constant;
int *const constant_ptr;

「ptr_to_constant が指すオブジェクトの内容は、そのポインターを介して変更されませんが、ptr_to_constant 自体は別のオブジェクトを指すように変更される場合があります。同様に、constant_ptr が指す int の内容は変更される場合がありますが、constant_ptr 自体は常に変更されます。同じ場所を指してください。」(6.7.5.1 ポインタ宣言子)

前に読んだことから、次の 2 つのステートメントは同じ動作を引き起こします。

int *const constant_ptr; /* This form is mentioned in the standard */
int const *constant_ptr; /* This form is NOT mentioned in the standard */

2 番目の形式が正しいのか、単なる拡張なのか疑問に思っていました。

前もって感謝します、-S

4

3 に答える 3

2

`const' キーワードがアスタリスクの左側にあり、宣言内で唯一のそのようなキーワードである場合、ポインターが指すオブジェクトは定数ですが、ポインター自体は変数です。

int a = 1;
int b = 2;
const int *p1;
p1 = &a;
p1 = &b; // Can be pointed to another variable
*p1 = 23; // <----- NOT ALLOWED

`const' キーワードがアスタリスクの右側にあり、宣言内で唯一のそのようなキーワードである場合、ポインターが指すオブジェクトは変数ですが、ポインターは定数です。つまり、ポインタは、一度初期化されると、そのスコープ全体で常に同じオブジェクトを指します。

int a = 1;
int b = 2; 
int * const p2 = &a;
*p2 = 7; // <----- Can assign a value via indirection
p2 = &b; // <----- NOT ALLOWED

`const' キーワードがアスタリスクの両側にある場合、ポインタとポイントされたオブジェクトの両方が定数です。

int a = 1;
int b = 2;
const int * const p3 = &b;
*p3 = 42; // <------ NOT ALLOWED
p3 = &a; // <------ NOT ALLOWED
于 2013-08-12T11:29:19.660 に答える
1

「const」キーワードは、これら 2 つのケースで異なるものを変更します。

「const int *」は、変更できない「int」部分であることを意味します。

「int *const」は、変数値自体 (ポインター) だけを変更できないことを意味します。

これはあなたが引用したテキストで述べられていますが、より洗練された方法で述べられています.

いくつかの割り当てを実行してみて、どのエラーが発生するかを確認してください。アイデアが得られます。

于 2013-08-12T10:01:17.617 に答える