2017-02-20 26 views
1

は、私はchar型の配列があるとし、これはokです:C/C++初期化のchar配列がchar constのための*

char myChars[100] = "hello"; 

しかし、私は

const char* hello="hello"; 
char myChars[100] = hello; 

または

const char hello[6]="hello"; 
char myChars[100] = hello; 
を持っている場合

許可されていません:

error: array must be initialized with a brace-enclosed intializer 

これは基本的に同等の文であると私には思われますが、なぜこの場合ですか?

+0

あなたは 'const char myChars [] =" Hello ";'しようとしましたか? –

+0

私はarduinoでC++を使用していますが、私は言語がこのエリアで似ていると思っています。違いがどうか説明してください。 – jdex

+0

@Thomas私はそれが疑問だとは思わない。 –

答えて

6

ポインタは配列ではなく、配列はポインタではないためです。

これらの例は同等ではありません。文字列リテラル"hello"はポインタではなくconst char[6]で、char myChars[100]を特殊なケースとして初期化するために使用されます。

しかし、最初にポインタを崩壊させると、その配列を後で元に戻すことはできません。一般的なケースでは、コンパイラが配列の大きさを知る方法や、それが1であることを知る方法はありません。したがって、前に来たものであっても、ポインタから配列を初期化することは無効です。

+0

それでは、 'const char hello [6] =" hello ";'と 'char myChars [100] = hello;'を実行するのは違法ですが、 'char myChars [100] =" hello "; – jdex

+0

@jdex。いいえ、あなたはコンピュータのように考える必要があります。 'char myChars [100] =" hello ";' 100要素の配列を作成し、構文砂糖([もっと楽にするための特別なルール)](https://en.wikipedia.org/wiki/Syntactic_sugar)、initialize文字列リテラルの場合はコピーを使用します。 'char myChars [100] = hello;'は100文字の配列を作成し、それをポインタで初期化しようとします。ロジックの最後の飛躍を 'char'へのポインターから文字列リテラルへのポインターにする構文的な砂糖はありません。 – user4581301

+0

@jdex:型問題を抱えていますが、配列のコピーができないという一般的なルールが適用されています(特殊文字列リテラルの場合を除いて)。今私たちは歴史的な理由からおそらく驚くべき例外の領域に入っています。 '' hello''はリテラルですが 'hello'は変数なので、2つの文は等価ではありません。ごめんなさい! –

2

ポインタの配列を区別する必要があります。

以下が一定テキストへのポインタを定義:
const char* hello="hello";

次の配列を定義:
char myChars[100];

あなたがアレイの単一のスロットへのポインタを代入しようとしている。
char myChars[100] = hello;

std::stringを使用することをお勧めします。組み込みプログラミングで

、私は頻繁に使用します。
static const char hello_text[] = "Hello";

私は、コンパイラは、配列のサイズを決定しましょう。

+1

*配列の1つのスロットにポインタを割り当てようとしています。これは代入ではありませんが、初期化とポインタは 'char'配列の適切な初期化子ではありません。 – chqrlie

1
char myChars[100] = hello; 

その種類が異なるためchar[]アレイは、ポインタ型(hello)から初期化することができません。

コンパイラエラーメッセージは、それがのようにリテラル文字列を使用して初期化することができ言うように:

char myChars[100] = "hello"; 

または

char myChars[100] = { 'h', 'e', 'l', 'l', 'o', '\0' }; 

"hello"または{ 'h', 'e', 'l', 'l', 'o', '\0' }は、char[6]配列型にその缶を推測します両方myCharsの初期化コードとして使用してください。

関連する問題