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

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

2)正確には「こんにちは」のタイプです。リテラル文字列と呼ばれることは知っています。しかし、それは単なる文字の配列でもありますか?

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

4

2 に答える 2

6

必要に応じて、次のように宣言できます。

char array[] = "hi!";

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

char const *array2 = "hey!";

読み取り専用メモリへのポインタ、文字列リテラルを作成します

array2 = array;

これで、array2 ポインターを使用して配列 1 にアクセスできるようになりました。これはポインター減衰と呼ばれます。array と array2 は、ここで連携できますが、同じ型ではありません。char 型の配列は、char 型のポインタへと「崩壊」します。

array = array2; // ERROR

配列はポインターではありません。配列はポインターのように考えていますが、実際には事前に割り当てられています。アドレスを割り当てようとしていますが、array[] には、作成時に既に「ハードコードされた」ものがあり、変更できません。

于 2012-04-22T00:05:55.527 に答える
6

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

配列をコピーするには、各要素を 1 つずつコピーします。

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

より良い代替手段はstd::stringです。必要な動作などを組み込み、文字の配列を保持するために特別に設計されています。

「こんにちは」は、コンラッド・ルドルフが指摘するように、const char [3].

生配列のcining に関しては、配列にはオーバーロードが提供されていないため、標準的な手段では不可能cinです。ただし、独自のオーバーロードを作成することは可能です。ただし、生の配列ではなくサイズを知っているコンテナーに対して定義しない限り、渡される配列のさまざまなサイズをどのように説明するかわかりません。

于 2012-04-21T23:39:54.073 に答える