2009年10月12日
C言語の配列とポインタの違いを理解したい方へ
C言語の配列とポインタは違います。どう違うのかWEBで調べてみると、みんな説明がバラバラで面白いです。というわけで、C言語の配列とポインタの違いについて説明してみて、このWEB上の混沌としている状況をさらに悪化させようと思います。
配列
ソース
#include <stdio.h> int main() { char data[4] = "abc"; /* アドレスを調べる */ printf("01:%p\n", data); printf("02:%p\n", &data); printf("03:%p\n", &(data[0])); /* abcを表示させる */ printf("04:%s\n", data); /* 値を書き換える */ data[0] = 'd'; data[1] = 'e'; data[2] = 'f'; printf("05:%s\n", data); return 0; }
実行結果
01:0x22cd74 02:0x22cd74 03:0x22cd74 04:abc 05:def
01〜03まで、アドレスを表示させています。全て同じアドレスを指し示しています。
ここで気になるのが02の結果です。
「&」を使用して「data」のアドレスを取得していますが、同じアドレスを指し示しています。「data」は配列であってポインタでは無いため、「data」自身はアドレスを保存する領域を持っていません。でも、「data」は配列の先頭を表しているため、ややこしいことにポインタのように使えます。でも、ポインタのように使えるだけで、アドレスを保存する領域が無いため、インクリメントしたり、アドレスを代入したりすることは出来ません。
「&」でアドレスを取得しても「data」は配列自身なので「data」と「&data」は同じアドレスを指します。
ポインタ
ソース
#include <stdio.h> int main() { char *data = "abc"; /* アドレスを調べる */ printf("01:%p\n", data); printf("02:%p\n", &data); printf("03:%p\n", &(data[0])); /* abcを表示させる */ printf("04:%s\n", data); /* 値を書き換える */ data[0] = 'd'; data[1] = 'e'; data[2] = 'f'; printf("05:%s\n", data); return 0; }
実行結果
01:0x402020 02:0x22cd74 03:0x402020 04:abc 05:def
01〜03まで、配列と同じくアドレスを表示させています。配列の時とは違い、02が違うアドレスを指しています。
「data」はポインタのため、アドレスを保持しています。そのアドレスとは「"abc"」の先頭、つまり「'a'」のアドレスです。
「data」の領域は「"abc"」とは別の場所にあり、そのため「&」でアドレスを取得すると「data」自身の領域のアドレスを指します。
まとめ
配列はアドレスを保管するための領域を持っていないため、「&」で配列自身のアドレスを取得しても、配列自身と何も変わらない。それに対し、ポインタはアドレスを保管する変数であり、保管するための領域を持っている。ポインタを配列のように使うと、配列のときとは違いポインタが配列へのアドレスを保管する形になる。そのため、「&」を使用してアドレスを取得すると、ポインタの領域(配列へのアドレスを保管している)のアドレスが取得され、「ぽいんたのぽいんた」になる。
- 21 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBS_jaJP320JP320&q=23ch+info
- 15 http://www.google.co.jp/search?q=23ch&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 13 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:en-US:official&hs=rGp&q=jscript+コマンド+実行&btnG=検索&lr=
- 12 http://www.kt.rim.or.jp/~kbk/zakkicho/
- 12 http://www.kt.rim.or.jp/~kbk/zakkicho/index.html
- 11 http://d.hatena.ne.jp/kilrey/20091011
- 11 http://ezsch.ezweb.ne.jp/search/?sr=0101&query=23ch
- 10 http://reader.livedoor.com/reader/
- 8 http://d.hatena.ne.jp/
- 8 http://search.yahoo.co.jp/search?p=23ch.info+見れない&rs=0&search_x=1&tid=top_ga1_sa&ei=UTF-8&yuragi=off&fr=top_ga1_sa&yuragi=off


