3 ポインター演算

3.1 どのような演算ができるか

ポインターは,整数型の値の和と差の演算ができる.しかし,積と商の演算はできない. すなわち,リスト2のようにポインターに整数を足したり引いた りする場合,エラーも無くコンパイルできて,実行も可能である.それにたいして,リス ト3に示すかけ算や割り算の演算はコンパイル時にエラーとなる.
   1 #include <stdio.h>
   2 
   3 int main(void)
   4 {
   5   int *p1, *p2, *p3, *p4;
   6   int i1=111, i2=222;
   7 
   8   p1=&i1;
   9   p2=&i2;
  10 
  11   p3=p1+3333;
  12   p4=p1-4444;
  13 
  14   return 0;
  15 }

   1 #include <stdio.h>
   2 
   3 int main(void)
   4 {
   5   int *p1, *p2, *p3, *p4;
   6   int i1=111, i2=222;
   7 
   8   p1=&i1;
   9   p2=&i2;
  10 
  11   p3=p1*3333;
  12   p4=p1/4444;
  13 
  14   return 0;
  15 }

3.2 和や差の演算の意味

ポインターに整数を足したり,引いたりすることができることが分かった.これには,ど ういう意味があるのだろうか? リスト4がそれに対する答えであ る.ポインターの演算--整数の加算と減算--は,データの型のバイト数分,ポインター がシフト(移動)する.プログラムの実行結果から分かるように, -4pt となっている.

ポインターに加算される整数は,ポインターが指し示すデータの移動量を表す.ひとつの アドレスには1バイトのデータが格納できる.そして,文字型のデータでは1バイト,整数 型では4バイト,実数型では8バイトのメモリーである.これが,型に依存して,アドレス の変化の仕方が異なった理由である.

   1 #include <stdio.h>
   2 
   3 int main(void)
   4 {
   5   char *cp;
   6   int *ip;
   7   double *dp;
   8   int i;
   9 
  10   for(i=0; i<4; i++){
  11     printf("%d %p\t%p\t%p\n",i, cp+i, ip+i, dp+i);
  12   }
  13 
  14   return 0;
  15 }
\fbox{実行結果}
0 0xbff0eb9c    0xbff0eb08      0x8048416
1 0xbff0eb9d    0xbff0eb0c      0x804841e
2 0xbff0eb9e    0xbff0eb10      0x8048426
3 0xbff0eb9f    0xbff0eb14      0x804842e



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年2月16日


no counter