ここを読む前に先週の 「コンピュータのメモリ」の説明を復習しておこう。
【爺】 | 姫、今日は平民どもに麗しの御言葉を掛ける日でございます。 |
---|---|
【姫】 | んむ? 今日の爺は何と申す? |
【爺】 | たはっ、失礼致しました。絵符月と申しまする。 今日の御言葉の儀を取り次ぎに参りました。 |
【姫】 | ほう、絵符月か。で、今日は誰が来るのじゃ? 通せ。 |
【爺】 | ははっ、では通しまする。 これ、そこの、 平民。通れ。 |
【平民】 | ははーあ。 |
【爺】 | これから姫がありがたきお言葉を発せられる。 しかと書き留めるものは用意したのか? |
【平民】 | もちろんでござります。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);
という意味だったのである。