1 次元配列,初期設定,及び,ポインタ

01	/****************************************/
02	/* 1 次元配列,初期設定,及び,ポインタ */
03	/*      coded by Y.Suganuma             */
04	/****************************************/
05	#include <stdio.h>
06	
07	int main()
08	{
09	/*
10	     初期設定された値と確保された領域のサイズ
11	*/
12		int x2[6] = {1, 2, 3, 4, 5, 6};  /* 6つのデータ領域 */
13		int i1;
14		for (i1 = 0; i1 < 6; i1++)
15			printf("%d ", x2[i1]);
16		printf("(%dバイト)\n", sizeof(x2));
17	
18		int x3[]  = {1, 2, 3, 4};        /* 4つのデータ領域 */
19		for (i1 = 0; i1 < 4; i1++)
20			printf("%d ", x3[i1]);
21		printf("(%dバイト)\n", sizeof(x3));
22	
23		char c1[15] = {"test data"};     /* 15個のデータ領域 */
24		char c2[] = {"test data"};       /* 10個のデータ領域 */
25		char *c3 = {"test data"};   // 使用すべきではない(警告が出力される)
26		printf("%s (%dバイト)\n", c1, sizeof(c1));
27		printf("%s (%dバイト)\n", c2, sizeof(c2));
28		printf("%s (%dバイト)\n", c3, sizeof(c3));
29	/*
30	     要素の参照と変更
31	*/
32		int *x1 = x2;   // x1 = &x2[0]でも可
33		x1[1]   = -1;
34		*(x1+2) = -2;
35		x2[3]   = -3;
36		*(x2+4) = -4;
37		for (i1 = 0; i1 < 6; i1++)
38			printf("%d ", x1[i1]);
39		printf("\n");
40		for (i1 = 0; i1 < 6; i1++)
41			printf("%d ", x2[i1]);
42		printf("\n");
43	
44		char *c4;   /* 文字列を指す1つのポインタ */
45	//	c1 = "test1 data    ";
46	//	c2 = "test2 data";
47		c3 = "test3 data";   // 使用すべきではない(警告が出力される)
48		c4 = "test4 data";   // 使用すべきではない(警告が出力される)
49		printf("%s (%dバイト)\n", c3, sizeof(c3));
50	printf("%s (%dバイト)\n", c4, sizeof(c4));
51	
52		return 0;
53	}
		
16,21 行目

  int 型配列のために確保された領域の大きさを出力しています.int 型は 4 バイトであるため,それぞれ,24 および 16 が出力されます.

26 ~ 28 行目

  宣言および初期設定の方法により sizeof の出力が異なることに注意してください.特に,28 行目に対しては,文字列の長さではなく,ポインタ変数として使用される領域の大きさが出力されます.ただし,25 行目の表現に対してはコンパイラによって警告メッセージが出力されるため,使用しない方が良いと思います.

32 行目

  配列 x2 の先頭アドレスをポインタ変数 x1 に代入しています.このようにすることによって,33 から 36 行目に見るように,x1 と x2 を全く同様に使用できます.また,先頭アドレスではなく,例えば「x1 = &x2[2]」とすることにより,x1 を x2 の後半 4 つのデータに対応する 4 個の要素を持った 1 次元配列として使用することも可能です.

  このように,x2 は,ポインタとほとんど同じ働きをしますが,「 x2++ 」などの演算はできないなど,多少の違いがあります.実際,
	int x1[6] = x2;			
のような操作(配列を他の配列に代入する操作)は不可能になります.

45 ~ 48 行目

  32 行目に対する説明と同様,45,46 行目のように,配列に代入することはできません.ただし,47,48 行目のように,char に対するポインタとして宣言されていれば,文字列(のアドレス)を代入することが可能です.ただし,47,48 行目の表現に対してはコンパイラによって警告メッセージが出力されるため,使用しない方が良いと思います.

  このプログラムを実行すると,以下のような結果が得られます.
1 2 3 4 5 6 (24バイト)
1 2 3 4 (16バイト)
test data (15バイト)
test data (10バイト)
test data (4バイト)
1 -1 -2 -3 -4 6 
1 -1 -2 -3 -4 6 
test3 data (4バイト)
test4 data (4バイト)