2011-10-20 18 views
10

これは別のquestionの続きです。文字列配列の初期化

次のコードを考えてみましょう:それは私の驚きにコンパイル(どうやら私も、私が思ったように、Cの文法を知らない)と、次のエラーを生成しません

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

を:

error: initializer element is not constant 
私は[]のcharにchar *型を変更した場合

それが正常にコンパイルされます。

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

は、誰かがなぜ私に説明できますか?

答えて

6

最初の例(char *hi = "hello";)では、静的const文字列 "hello"を指すように初期化される非constポインタを作成しています。このポインタは、理論的には、あなたが好きなものを指すことができます。

第2の例(char hi[] = "hello";)では、ポインタではなく配列を定義しているため、参照先のアドレスは変更できません。配列は、特定のメモリブロックに対する変更不可能なポインタと考えることができます。

あなたの最初の例は実際にはC++(私のコンパイラ、少なくとも)で問題なくコンパイルされています。

+1

ありがとうございました。 constキーワードを使用してコードの第1部分を動作させる方法はありますか? – lang2

+1

@ lang2その範囲にはありません。この[C FAQ](http://c-faq.com/ansi/constasconst.html)を参照してください。 'char * const hi'(charへの定数ポインタ)でさえもありません。 – cnicutar

+0

ちょっとしたことが追加されました。 'うまくいくかどうかわかりません。最初のバージョンはC++でOKです.-瞬間が来たらCコンパイラで試してみます:) – icabod