10-1.変数とポインタとの違いに気を付けてください。 ポインタは、変数のアドレスを格納するよりは、配列のアドレスを格納する方がずっと使用頻度は高くなります。
(変数)char a = 123; のとき |
|
||||||
(配列)char a[4] = "ABC"; のとき |
このとき a == &a[0] |
ポインタは必ず、
の 3ステップで用います。
配列のアドレスをポインタに設定した場合、配列の各要素をポインタを使ってアクセスすることができます。 この場合、「ポインタの値を変えずにデータを参照」するやり方と、 「ポインタの値そのものを更新してデータを参照」するやり方の2通りがあります。
どちらを選んでもかまいませんが、後者の場合には、ポインタに格納されているアドレスが更新されますので、 後でそのポインタを使おうとしたときに、更新されたことを忘れていると、 思わぬエラーの原因になりますので、注意が必要です。
実は
「ポインタに 1 加える」ということは
「ポインタに格納されているアドレス + 1番地」ではなく
「ポインタに格納されているアドレス + 型のサイズ」
ということになります。
つまり、同じ「++p」でも
char型なら サイズ 1バイトなので 1番地
int型なら サイズ 2バイトなので 2番地
long型なら サイズ 4バイトなので 4番地
float型なら サイズ 4バイトなので 4番地
double型なら サイズ 8バイトなので 8番地
アドレスが増えることになります。
何故このようにするのでしょう?それは、型によって増分値を考慮するのは効率が悪いからです。
実は
char str[80]; scanf("%s", str);
は、「配列strの先頭要素のアドレスが示すメモリエリアに入力データを文字列として格納」の意味になります。
また、2次元配列の場合のアドレスは次のように表します。
char str[3][7] = { "ABC", "DEFGHI", "JK" };
str | 配列 str の先頭要素のアドレス(1000) |
---|---|
str[0] str[1] str[2] |
str[0] の先頭要素のアドレス(1000) str[1] の先頭要素のアドレス(1007) str[2] の先頭要素のアドレス(1014) |
&str[0][0] &str[1][0] &str[2][0] |
str[0][0] のアドレス(1000) str[1][0] のアドレス(1007) str[2][0] のアドレス(1014) |
str[0][0] str[1][0] str[2][0] |
str[0][0] の中身('A') str[1][0] の中身('D') str[2][0] の中身('J') |
このとき str == str[0] == &str[0][0]
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved