これまでのことを整理するためにlong型のポインタとchar型のポインタの違いを
見てみることにします。コンピュータによってポインタの大きさは異なりますが、
ここでは現在主流である32bitと仮定して解説します。
上図のように、long型ポインタもchar型ポインタも、ポインタは32bit(4byte)変数です。
char型のサイズは8bit(1byte)なので、char型ポインタを1つ進めると、ポインタの値は
1増えます。
これに対してlong型の場合は、32bit(4byte)の大きさなので、long型ポインタを
1つ進めると、ポインタの値は4(byte)増えます。1(byte)とか2(byte)増やすことは
基本的にはできません。char型ポインタにキャストして増やせば1増やすことも
可能ですが意味がありません。
もし1(byte)とか2(byte)とか増えたら、下図の※の
ように、無効な変数へのアクセスをしてしまうことになります。
次に、ポインタの演算について説明します。これから説明することはコンパイラによって
多少違う点があるかもしれません。
ポインタはアドレスなので、アドレスの計算に意味がないような演算は許されません。
例えば、ポインタの乗算、除算は、意味がないので許されません。またポインタ同士の
加算も意味がありませんが、減算は要素数を知るために必要なので可能です。
あくまでも要素数になり、バイト数ではないことに注意が必要です。さらに、
ポインタ同士の比較は同じ型のポインタどうしてなければできません。これらを
まとめると以下のようになります。
許される演算
- 同じ型のポインタ同士の減算
- 同じ型のポインタ同士の比較
- ポインタと整数の加算
- ポインタから整数の減算
|