2015-12-05 7 views
5

あなたが(intなど)のポインタを宣言する際に通常、あなたがそれにメモリアドレスを割り当てる必要があるだろう:なぜ、配列をcharポインタに割り当てることができますか?

​​

あなたはchar型のポインタを作成するときに、あなたがすることなく、それにchar型の配列を割り当てることができますアドレスを含める必要があります。

char* c = "Char Array"; 

この機能はどのように動作しますか?それはメモリを割り当て、それを指していますか?なぜ他の型ポインタも同じことをすることができないのですか?

+0

これは実行できません。 'char * c = &'a';' –

+0

'char * c =" char配列 "はC++ではコンパイルされません。代わりにCについて聞いてみたいですか? – edmz

+0

@ダニエルあなたのC++コンパイラは、少なくともあなたに警告を与えていない場合、吸う。 –

答えて

7

これはどのように機能しますか?

リテラル文字列は、(それがコンパイル時に初期化されることを意味する)の実行可能ファイルの読み取り専用データセクションに格納され、cはそのメモリロケーションを指すように初期化されます。陰的なarray-to-pointer conversionが残りを処理します。

文字列リテラルをchar*に変換すると、内容は読み取り専用であるため、非推奨です。文字列リテラルを指すときはconst char*を好む

関連する構造体char c[] = "Char Array";は、実行時に文字列リテラルの内容をchar配列にコピーします。

なぜ他のタイプのポインターも同じことをすることはできませんか?

これは、文字列リテラルのための特別なケースでは、便宜上、C.

1

から継承された他のタイプのポインタは、同様にうまくこれを行うことができます。文字列リテラルは文字の配列なので、ポインタに代入するためにアドレス演算子を使う必要はありません。

あなたは整数配列を持っている場合は、int型*または[]あなたにもアドレス演算子を使用せずにポインタをintに割り当てることができint型のいずれか:

int intArray1[] = {0, 1, 2}; // fist array 
int * intArray2 = new int[10]; // second array 
// can assign without & operator 
int * p1 = intArray1; 
int * p2 = intArray2; 

char *は、文字列リテラル型のものだけで固有のものです実際にはconst char *であり、依然として(廃止予定の変換についての警告とともに)割り当てることが許可されています。

関連する問題