char配列の初期化

変数を用意する記述(つまり変数宣言)において、特定のデータが記憶されるように、 =宣言子を伴う指定を変数の初期化と呼びました。

配列も同様に=宣言子で次のように可能です。ここでは、char配列の先頭要素から
48, 49, 50, 0, 65, 66, 67, 0 と順番に初期化している例です。 (ASCIIコード表参照

	char a[10] = { 48, 49, 50, 0, 65, 66, 67 , 0 };

 次のように並べた数より大きな数を指定した場合は、初期化データがない範囲の要素が 0に初期化されます。

char配列の要素は1byte整数ですが、この配列記憶イメージを文字定数で示すと次のようになります。 上下の記憶イメージで、実質的な配列記憶内容はまったく同じです。

このような配列宣言は、次のプログラムコードのように文字定数で初期化した場合と まったく同じになります。(なお、'\0'は8進数で表現している0です)

	char a[10] = { '0', '1', '2', '\0', 'A', 'B', 'C' };

そして、このような配列宣言は、次のプログラムコードのように 文字定数で初期化した場合と まったく同じになります。

	char a[10] = "012\0ABC";


さて、配列の要素数指定を省略した場合は、どうなるでしょうか?

	char a[] = "012\0ABC";

この場合次のイメージで、[ ]8 が省略されていることになります。 それは文字列定数の終端に '\0' が 埋め込まれる規則があるからです。

charの配列名は、先頭のchar要素を指し示しているポインタなので、(char *) 型です。 これは、文字列の型と同じで printfの引数で指定できます。以下でこの配列名を引数にしたコードと 実行例を示します。

ソースコード実行例
#include<stdio.h>
main(){
	char a[] = "012\0ABC";         
	printf( a );
	putchar( '\n' );
	a[3] = '3';
	printf( a );
}
012                               
0123ABC




                        
最初に実行しているprintfでは、123しか表示しません。 それは、printf関数の機能が引数で指定した位置から並ぶ文字コードを、 '\0'が出現する直前まで表示する機能になっているからです。 a[3]に'\0'があるわけですが、 それを'3'に変更した後で実行したprintfでは、配列全体の文字列が表示されます。

文字列による初期化も、 配列要素数で指定する数が、初期化で指定したデータ数より小さい次の表現は間違いです

	char a[7] = "012\0ABC";/* 文字列最後の'\0'を含めると8個の要素が必要 */


なお C言語では配列の名前が『配列先頭要素のアドレス』という変更できないもので、次のような表現はエラーになります。

	char a[8];
	a = "012\0ABC";/* 配列名は変更できない */
ですが、次のポインタ変数は可能です。(=は初期化指定子でなく、代入演算子です)
	
	char * a;
	a = "012\0ABC";/* ポインタ変数なら可能 */

= { データ, データ, データ, データ};の表記は、配列宣言の時にだけ可能です。
この時の=は 代入演算子でなく、初期化指定子で、これらデータが並ぶ要素の配列を 作る指示の表現です。 これを実行文で使うことはできなません。
よって、ポインタ変数であっても、次の表現はできません。

	char * a;
	a = { '0', '1', '2', '\0', 'A', 'B', 'C' };/* コンパイルエラー */

参考 他の配列の初期化