10

これは私が持っている別の質問の続きです。

次のコードを検討してください。

char *hi = "hello";

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

驚いたことにコンパイルされず (思ったほど C 構文を知らないようです)、次のエラーが生成されます。

  error: initializer element is not constant

char* を char[] に変更すると、正常にコンパイルされます。

char hi[] = "hello";

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

誰かが私に理由を説明できますか?

4

1 に答える 1

6

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

2番目の例(char hi[] = "hello";)では、ポインターではなく配列を具体的に定義しているため、配列が参照するアドレスは変更できません。配列は、メモリの特定のブロックへの変更不可能なポインタと見なすことができることに注意してください。

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

于 2011-10-20T10:37:28.440 に答える