2012-08-07 25 views
6

const値のグローバル配列を作成すると、次のようになります。const配列のconst値へのポインタ

const int SOME_LIST[SOME_LIST_SIZE] = {2, 3, 5, 7, 11}; 

何らかの方法でSOME_LISTを変更することは可能ですか?

これは、SOME_LISTがconstメモリの場所を指し、constポインタそのもの(つまり、他のどこかで指されていない)に書くことができますか?

+3

'SOME_LIST'はとにかく変更できません –

+3

' SOME_LIST'は[配列、ポインタではありません] //stackoverflow.com/questions/4810664/)、心配するconstレベルは1つだけです。 – fredoverflow

答えて

8

正しい方法です。

また、SOME_LIST_SIZEを提供する必要はありません。 C++はイニシャライザから自動的にそれを把握します。

+0

ちょうど私が別の場所を指し示すか、またはそれをmemsetしようとすると、コンパイラエラーがスローされます。 – Darthfett

+1

@Darthfett:はい、そうです。特に悪意のある人は、 'const_cast'を使うことができるかもしれませんが、ポインタではないので、私は未定義の動作領域を踏みにじっていると確信しています。 – KRyan

+3

もちろん:配列を再配置することはできませんし、 'memset'は' const'ポインタを与えていると不満を持ちます。明らかに、この最後の保護を 'const_cast'でバイパスすることができますが、あなたはUB-landに入ります(実行時にクラッシュする可能性があります)。 –

11

"const"キーワードを含むポインタの主な例が3つあります。 (linkを参照)

最初に:定数変数へのポインタを宣言します。ポインタは移動し、ポインタの内容を変更することができますが、変数は変更できません。

const int* p_int; 

第2に、変数への「移動不可能な」ポインタを宣言する。ポインタは「固定」ですが、データは変更できます。このポインタは宣言して割り当てなければなりません。それ以外の場合はNULLを指してそこに固定されます。

int my_int = 100; 
int* const constant_p_int = &my_int; 

第3に、固定データへの不動のポインタを宣言する。

const int my_constant_int = 100; (OR "int const my_constant_int = 100;") 
const int* const constant_p_int = &my_constant_int; 

これも使用できます。

hereを参照してください。これを書いている間にあなたの質問はすでに答えられていると分かります...

+1

私はポインタ上のconstの使用に精通していました。それは私が確信していた配列でした。まだ知っておくべき非常に良いこと。 :) – Darthfett

+0

はい、最近私はそれの周りに私の頭を取得していたので、共有するかもしれないと思った(: – user3728501

関連する問題