各データ型の占有するメモリ領域とポインタ演算
3.2 ポインタ演算での留意事項
ポインタ変数(ここでは、int *ptr1, *ptr2;
が宣言されているとして説明します)を使った演算では、次のような留意事項があります。
- 同じ型のポインタ変数は代入操作が可能です。
例えば、ptr1 = ptr2; とすれば、ptr2 の指すアドレスが ptr1
に代入されます。
- ポインタ変数に数値を代入することは好ましくありません。
ポインタ変数 ptr1 =
2345;のように、アドレス値を直接代入する ことはできません(ただし、数値 NULL, 0 だけは例外で、ptr1 = NULL; と記述
することができます。これはポインタがどのアドレスも指していないという状態を 示すのに使います)。 また、*2345
のように、アドレス値を直接使った参照も不可能です。
- ポインタ変数同士は関係演算子で比較することが可能です。
ptr1 > ptr2 (アドレスの前後関係) や ptr1 ==
ptr2 (アドレス値の等価) といった式は成立します。 ただし、これらの演算は各ポインタが同じ型の同じ対象のデータを指している
場合のみ有効となります。例えば、ある配列中のデータを指す ptr1 と別の配列中の データを指す ptr2
を比較することは可能であっても、無意味でしょう。
- ポインタ変数と整数間では加減算ができます。
このとき、上述したように実際のアドレス値はデータ型によってスケーリング
されます。例えば、ptr1 - 2 は *ptr1 が int型(4バイト占有)なので、ptr1 の アドレス値から 2 × 4
バイト分前のアドレスを指すことになります。 つまり、整数の加減算は操作するデータの要素数として扱われるということです。
- ポインタ変数同士の引き算は可能です。
例えば、ptr2 - ptr1 はそのアドレス間のデータ要素数の差を計算します。
ただし、ポインタ同士の比較演算同様、同じ対象のデータ間でないと意味が ありません。
- ポインタ同士の加算(例:ptr1 + ptr2)、ポインタの乗除算(例:ptr1 * 2, ptr2 / 3, ptr1
*ptr2)、double型変数、float型変数との加減算、 ある型のポインタを別の型のポインタに代入することなどは禁止されています。