2012-04-21 29 views
5
char arr[3]; 
arr="hi";// ERROR 
cin>>arr;// and at runtime I type hi, which works fine. 

1)誰かがなぜ私に説明することができますか?リテラル文字列にchar配列を代入する - C++

2)と、正確には "hi"の種類がわかります。リテラル文字列と呼ばれています。それは単なる文字列の配列ですか?

3)cin >> arrではありません。実行時に入力するものにarrを割り当てるのと同じでしょうか?

答えて

6

C++の配列は実際の型ではなく、一連の値の構造化された表現であり、どこからでも(ポインタが崩壊する)見つかるはずのポインタではありません。あなたは、割り当てを含む他のタイプを使うようにそれらを使うことはできません。選択肢は、配列のサポートをたくさん追加するか、可能な限りシンプルかつ高速に保つことでした。後者が選択されました。これは、C++が他の言語と区別している点の1つです。

アレイをコピーするには、各要素を1つずつコピーします。

C++ 11には、STLコンテナstd::arrayがあります。これは、演算子のオーバーロードを伴う単純な配列として、またSTLの残りの部分に関連するように設計されています。

より良い代替品はstd::stringです。これは、あなたが望むような振る舞いを取り入れ、特に文字の配列を保持するために設計されています。

"hi"は、Konrad Rudolphが指摘するように、const char [3]です。

cin生アレイの場合、配列のあるcinには過負荷がないため、標準的な方法では不可能です。あなた自身の過負荷を作成することは可能です。しかし、生の配列ではなくサイズを知っているコンテナに対して定義しない限り、渡される配列のサイズがどう違うかはわかりません。

+0

さらに良い方法は 'std :: string'です。 – Cornstalks

+0

おっと、それは文字の配列だったのを忘れてしまった^ _^ – chris

+0

私は本当にこの概念を理解しようとしているbest.imを探していない本当にありがとう。私は本当にプログラミングで知っていますが、このCスタイルの文字列を使用しません。 –

6

ご希望の場合は、宣言することができます。

char array[] = "hi!"; 

は、配列を作成し、4バイト長にそれを「初期化」「こんにちは!」

char const *array2 = "hey!"; 

はメモリ、

array2 = array; 

あなたは今、アレイ1にアクセスするための配列2のポインタを使用することができますリテラル文字列読み取り専用にポインタを作成します。これはポインタの減衰と呼ばれます。 arrayとarray2は同じタイプではありませんが、ここで協調することはできます。 のchar型が "崩壊し" のポインタ-型のchar型に変換されます。

array = array2; // ERROR 

配列はポインタではありません。あなたは配列がポインタであると考えています。実際には、それはあらかじめ割り当てられています。あなたはアドレスを割り当てようとしていますが、配列[]は既に作成されたときには "ハードコードされた"ものが1つあり、変更することはできません。

関連する問題