ポインタ型
コンパイラには、関数ポインタとデータポインタという2種類の基本ポインタ型があります。ポインタタイプには関連の整数型と同じアライメントがあります。
関数ポインタ
実行モード | データモデル | ポインタサイズ | アドレス範囲 |
|---|---|---|---|
32 ビット | なし | 32ビット |
|
64 ビット | ILP32 | 32ビット |
|
64 ビット | LP64 | 64ビット |
|
注記
ILP32データモデルでは、レジスタのポインタは常に64ビットです。32 ビット ポインタはレジスタにロードされるときにゼロ拡張され、ストア操作では最下位 32 ビットのみがストアされます。
関数ポインタ型が宣言されると、属性が*記号の前に挿入されます。次に例を示します。
typedef void (__thumb * IntHandler) (void);
これは、#pragmaディレクティブを使用して書き直すことができます。
#pragma type_attribute=__thumb typedef void IntHandler_function(void); typedef IntHandler_function *IntHandler;
データポインタ
使用できるデータポインタは1つだけです。 これらのプロパティがあります。
実行モード | データモデル | ポインタサイズ | アドレス範囲 |
|---|---|---|---|
32 ビット | なし | 32ビット |
|
64 ビット | ILP32 | 32ビット |
|
64 ビット | LP64 | 64ビット |
|
注記
ILP32データモデルでは、レジスタのポインタは常に64ビットです。32 ビット ポインタはレジスタにロードされるときにゼロ拡張され、ストア操作では最下位 32 ビットのみがストアされます。
キャスト
ポインタ間のキャストには以下の特徴があります。
整数型の値からそれよりも小さな型のポインタへのキャストは、切捨てにより実行されます。
ポインタ型からそれよりも小さな整数型へのキャストは、切捨てにより実行されます。
ポインタ型からそれよりも大きな整数型へのキャストは、ゼロ拡張により実行されます。
データポインタと関数ポインタ間のキャストは不正です。
関数ポインタを整数型にキャストすると、結果は不定になります。
符号なし整数型の値からそれよりも大きな型のポインタへのキャストは、ゼロ拡張により実行されます
size_t
size_tはsizeof演算子の結果の符号なし整数型です。32ビットモードと、ILP32データモデルを64ビットモードで使用しているとき、size_tに使用される型はunsigned intです。LP64データモデルの場合、size_tに使用した型はunsigned longです。
ptrdiff_t
ptrdiff_tは2つのポインタを差し引いた結果の符号付きの整数型です。32 ビットモードと、ILP32データモデルを64ビットモードで使用しているとき、ptrdiff_tに使用される型はsize_t型の符号付き整数バリアントです。LP64データモデルの場合、ptrdiff_tに使用した型はsigned longです。
intptr_t
intptr_tは、void*を保持するのに十分大きな符号付整数型です。IAR C/C++ コンパイラ for Armでは、intptr_t に使用する型はsigned long intです。
uintptr_t
uintptr_tは、符号なしであることを除き、intptr_tと同じです。