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