4

次の違いに関する質問を読みました。

const char*

const char[]

しばらくの間、私は配列がポインターの構文糖衣にすぎないと考えていました。しかし、何かが私を悩ませています。次のようなコードがあります。

namespace SomeNamespace {
    const char* str = { 'b', 'l', 'a', 'h' };
}

エラー: スケーラー オブジェクト 'str' には初期化子に 1 つの要素が必要です。だから、私はこれを試しました:

namespace SomeNamespace {
    const char str[] = { 'b', 'l', 'a', 'h' };
}

それはうまくいきました。最初は、これは const char* の場合に追加の操作が適用されるという事実に関係しているのではないかと考えていました。しかし、エラーはそう示唆していないようです。ただし、次の場合:

void Func() {
    const char* str = { 'b', 'l', 'a', 'h' };
}

期待どおりにうまくコンパイルされます。なぜこれがそうなのか、誰にも分かりますか?

x86_64/i686-nacl-gcc 4(.1.4?) pepper 19 ツール - チェーン (基本的に GCC)。

4

1 に答える 1

5

まず、名前空間スコープまたは関数で複合初期化を使用しようとしても違いはありません。どちらも機能しないはずです! あなたが書くとき

char const* str = ...;

charたとえば、文字列リテラルで初期化できる一連の s へのポインターを取得しました。いずれにせよ、charはポインター以外の場所にあります。一方、あなたが書くとき、

char const str[] = ...;

の配列を定義しますchar。配列のサイズは、右側の要素の数によって決定され、たとえば、例では 4 になります{ 'b', 'l', 'a', 'h' }。たとえば、代わりに使用した場合、もちろんサイズは 5 になります。配列の要素は、この場合定義さ"blah"れている場所にコピーされます。str

関数の引数を宣言すると、実際には と同じchar const x[] なります。char const* xchar const x[]char const*

于 2013-09-05T00:07:49.647 に答える