変数とアドレスの深い関係

ここを読む前に先週の 「コンピュータのメモリ」の説明を復習しておこう。

【爺】 姫、今日は平民どもに麗しの御言葉を掛ける日でございます。
【姫】 んむ? 今日の爺は何と申す?
【爺】 たはっ、失礼致しました。絵符月と申しまする。 今日の御言葉の儀を取り次ぎに参りました。
【姫】 ほう、絵符月か。で、今日は誰が来るのじゃ?
通せ。
【爺】 ははっ、では通しまする。
これ、そこの、
平民。通れ。
【平民】 ははーあ。
【爺】 これから姫がありがたきお言葉を発せられる。 しかと書き留めるものは用意したのか?
【平民】 もちろんでござります。char himeword[1000]; とたっぷり1000文字分でござります。このhimeword[1000]に ぜひともありがたき御言葉を。
【爺】 書き留め物の大きさなどどうでも良い。で、御言葉は どの場所に賜るのじゃ?
【平民】 おお、さやうでした。では、書き留めの先頭である himeword[0] に是非とも。
【爺】 うつけもの
この絵符月にhimeword[0]のアドレスを調べろと申すか。
この絵符月にhimeword[0]のアドレスを調べろと申すか。
こーのーえーふーげーつーうにー
【姫】 爺、うるさい。
【爺】 はっ、これはとんだ失礼を…
【平民】 申し訳ございません。アドレスは、アドレスは…
(んぬー、確か & を付ければ良かったはず)
えー、&himeword[0] に是非とも!!
【姫】 あんど、ひめわーどの……、
爺、わらわには長くて覚えられぬ。
面倒じゃ。次からこういうときは himeword だけで良い。

配列のアドレス

たとえば、char 型の配列を確保する。

char x[10];

これにより char 型(8bit)の入れ物が10個確保される。 最初は中味は未定義。

x[0]x[1]x[2]x[3]x[4]x[5]x[6]x[7]x[8]x[9]
????????????????????

この10個の入れ物にも、それぞれアドレスがある。各要素のアドレ スは、やはり変数名に & を付ければ良い。たとえば、要素 x[1] のアドレスを示したいときは &x[1] とす る。いっぽう、配列全体の先頭のアドレスを示したい場合は、 添字を取った配列名だけで書き表すことができる。つまり、x だけで 配列全体のアドレス を意味することになる。

配列全体の(先頭の)アドレスと、配列要素0番目のアドレス、は 結局同じものであるため、

&x[0]  ==  x

という関係になる。

fgetsによる読み込み再考

キーボード(標準入力)から文字列を読みこむときは、以下のようにした。

char line[100];			/* 十分な長さ(100)を確保 */
  :
 (中略)
  :
fgets(line, sizeof line, stdin);

このとき、line が配列であるにもかかわらずfgets の第1引数として line だけを渡しても平気だったのは、それが &line[0] と同じアドレスを意味するものだったからである。 つまり、

fgets(line, sizeof line, stdin);

は、

fgets(lineの先頭のアドレス, lineのバイトサイズ, stdin);

という意味だったのである。


目次