C言語で文字列を扱うということ〜ポインタと配列〜

文字列配列と文字列ポインタの関係

文字列について、
文字列には、配列で文字列を扱う方法とポインタで文字列を扱う方法があります。
まずは、それぞれのアドレスを調べてみるとそれぞれの関係が見えてきます。

char *test_pointer = "test pointer"
char test_array[] = "test array"

printf("test_pointer:%p¥n",test_pointer);
printf("&test_pointer:%p¥n",&test_pointer);
printf("&test_pointer[0]:%p¥n", &test_pointer[0]);

printf("test_array:%p¥n",test_array);
printf("&test_array:%p¥n",&test_array);
printf("&test_array[0]:%p¥n",&test_array[0]);

出力は以下の通りになります。

test_pointer:31c8a7
&test_pointer: 5dc343
&test_pointer[0]:31c8a7

test_array:12fed8
&test_array:12fed8
&test_array[0]:12fed8

そうそう、この結果に正直おどろきました。
&test_arrayとtest_arrayが同じアドレスを指すのです。
test_arrayとtest_array[0]が同じアドレスを指すことを知っている人は多いですが、上記を知っている人は
そう多くないと思います(自分のその一人です^^;)
でもこれではっきりしたことがあります。
配列はあくまでも配列であり、ポインタはあくまでもポインタです。
上記の関係を図で分かりやすくしてみます


f:id:ukinau:20131026170620p:plain


test_arrayという変数は配列を保持する変数なので、変数の中には「test_array」が入ってます。
test_pointerという変数は、アドレスを保持する変数なので、変数の中には「31c8a7」つまりアドレスが入ってます。

ただ、混乱させてしまう原因は、
配列は、
配列の先頭アドレス == 変数のアドレス
ということが成り立つことが原因です。
復習ですが、
test_arrayは、添字なしで使うと配列先頭アドレスを示します。
&test_arrayは、test_array変数のアドレスを示します

なので、

test_array:12fed8
&test_array:12fed8
&test_array[0]:12fed8

という出力が得られたのです。

ポインタの方は、図を見れば分かると思うので解説しません。