【課題3−10 ポインタの注意点】
<ポインタ型>
たとえば「ポインタに1加える」ということは,「ポインタに格納されているアドレス+1番地」ではなく,「ポインタに格納されているアドレス+型のサイズ」ということ.つまり,おなじ「p++」でも,char型なら1バイトなので1番地,int型なら2(4)バイトなので2(4)番地,long型なら4バイトなので4番地,アドレスが増えることになる.コンパイラがポインタの型を見て,自動的に型サイズ分の増減をしてくれる(のがポインタの便利なところ).
以下のようなプログラムを実行してみるとその様子がわかる.
char
str[] = "ABCDE";
int
num[] = {1, 2, 3, 4, 5};
double
flt[] = {1.1, 2.2, 3.3, 4.4, 5.5};
char
*cp = str;
int
*ip = num;
double
*dp = flt;
printf("char:addr value; int:addr value; double:addr value¥n");
while
(*cp) {
printf("%p %-4c; %p %-4d; %p
%-4.2lf¥n", cp, *cp, ip, *ip, dp, *dp);
cp++;
ip++; dp++;
}
<ポインタを更新する際の注意点>
ポインタの値そのものを更新して参照するときは,プログラム中でポインタが指しているアドレスを見失いがちになる.あらぬところを指しているポインタに値を書き込むと,別のエリアを破壊してしまうので要注意.