ポインタ演算
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/04/07 19:18 UTC 版)
「ポインタ (プログラミング)」の記事における「ポインタ演算」の解説
記憶域 (メモリ) のアドレス空間は、1次元空間である。たとえば32ビットシステムのアドレス空間は、16進数表記で 0x00000000 から 0xFFFFFFFF (4GiB-1) までの整数値が有効な範囲である。ポインタはこのアドレス空間を抽象化し、メモリ上の任意位置のデータ(オブジェクト)にアクセスするためのデータ型である。なお、プロセスのアドレス空間は物理メモリ上のアドレス(物理アドレス)に直接対応するとは限らない。通例、オペレーティングシステムによって物理メモリは抽象化され、プロセスごとに仮想アドレス空間が割り当てられ、プロセスごとの仮想アドレス空間におけるメモリの読み書き処理はOSによって物理アドレスに対する処理に変換される(メモリマッピング)。 ポインタに対する算術演算は、加減算のみが許可される。ポインタに加減算すると、そのポインタが指すデータ型のサイズに比例したオフセットがアドレスに加減算されることになる。これは配列の添え字演算子が、ポインタの加減算とデリファレンスの糖衣構文であることからも自明である。つまり、ある型Tへのポインタの加減算は、メモリ全体をTの配列とみなして、インデックスを増減していることに他ならない。 int* p = NULL;printf("Size of int = %d\n", (int)sizeof(int));printf("%p\n", p);p++; /* sizeof(int) * 1 だけアドレスが加算される。 */printf("%p\n", p);p += 10; /* sizeof(int) * 10 だけアドレスが加算される。 */printf("%p\n", p);p--; /* sizeof(int) * 1 だけアドレスが減算される。 */printf("%p\n", p); バイト単位のアドレッシングが必要な場合、char / signed char / unsigned charへのポインタを利用する。これらの型はサイズが1であることが規格で保証されているため、これらの型へのポインタに対する加減算操作はバイト単位のアドレッシングとなる。 なお、汎用ポインタvoid*は型が不明のため、アドレスの加減算を行なうことができないが、GCC拡張の非標準動作ではvoid型のサイズに1を割り当てるため、加減算が可能となっている。 void* pv = NULL;pv++; /* C/C++標準規格に準拠した環境ではコンパイルエラーとなる。 */printf("%p\n", pv); ポインタ型のサイズは処理系依存であり、通例ターゲットとするプロセッサアーキテクチャのレジスタ幅と同じサイズを持つ。 オフセット計算などでポインタ間の差を得る必要がある場合、
※この「ポインタ演算」の解説は、「ポインタ (プログラミング)」の解説の一部です。
「ポインタ演算」を含む「ポインタ (プログラミング)」の記事については、「ポインタ (プログラミング)」の概要を参照ください。
- ポインタ演算のページへのリンク