うわー、多くの「const」が進行中です。
int * const foo1
foo1
「intへのconstポインタ」です。の値foo1
は定数です。foo1
指すものは変更される場合があります。
int const foo2
const int foo3
foo2
とfoo3
は同じ型です - どちらも正しいです - C は両方を許可します。int
との順序はconst
スタイルの選択です。どちらの場合も、識別子は定数です。 私の経験では、最初に持っconst
ている方が一般的です。したがって、私は先行技術に従う傾向があります。さらに-モジュールと一貫性がある限り、どちらでも問題ありません。どちらの場合も、次のような初期化子が見つかると予想されますconst int foo3 = 7;
しかし、混乱の解明も必要です。
[編集された回答が続きます]
// OP's experimented with these
int * const * foo4;
int const * foo5;
OPは、「constはその左側に型がないのと同じように、その左側に型を修飾し、右側の部分を修飾する」と推測しました。これはこれら 2 について説明可能であり、追加のサンプルに適用されるようです。
foo4
「intへのポインタへのconstへのポインタ」です。
foo5
「const intへのポインタ」です。
追加のサンプル:
int * const foo6;
const int* foo7;
int const * const foo8;
foo6
「intへのconstポインタ」です。
foo7
は「const int へのポインタ」です - と同じfoo5
です。
foo8
「const intへのconstポインタ」です。
foo6
は定数ですが、それが指すデータは定数ではありません。
foo7
定数ではない場合、それが指すデータは定数として扱われます。
foo8
一定です。それが指すデータは定数として扱われます。
@ugorenはconst
、 a を横切って移動することについての投稿で正しい*
です。を動かすとタイプconst
が変わります。これはスタイルの違いではなく、コードの違いです。
参照:
C11 6.2.5.29 "例 1 ''float *'' として指定された型の型は ''pointer to float'' です。その型カテゴリは浮動小数点型ではなくポインターです。この型の const 修飾バージョンは '' として指定されます。 ''float * const'' 一方、''const float *'' として指定された型は修飾された型ではありません — その型は ''const 修飾された float へのポインター'' であり、修飾された型へのポインターです。
C11 6.7
http://cdecl.org/