Skip to main content

IAR Embedded Workbench for Arm 9.70.x

ポインタ型

このセクションの内容:

コンパイラには、関数ポインタとデータポインタという2種類の基本ポインタ型があります。ポインタタイプには関連の整数型と同じアライメントがあります。

関数ポインタ

関数ポインタにはこれらのプロパティがあります。

実行モード

データモデル

ポインタサイズ

アドレス範囲

32 ビット

なし

32ビット

0–0xFFFF'FFFF

64 ビット

ILP32

32ビット

0–0xFFFF'FFFF

64 ビット

LP64

64ビット

0–0xFFFF'FFFF'FFFF'FFFF

表99 関数ポインタ 


注記

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ビット

0–0xFFFF'FFFF

64 ビット

ILP32

32ビット

0–0xFFFF'FFFF

64 ビット

LP64

64ビット

0–0xFFFF'FFFF'FFFF'FFFF

表100 データポインタ 


注記

ILP32データモデルでは、レジスタのポインタは常に64ビットです。32 ビット ポインタはレジスタにロードされるときにゼロ拡張され、ストア操作では最下位 32 ビットのみがストアされます。

キャスト

ポインタ間のキャストには以下の特徴があります。

  • 整数型のからそれよりも小さな型のポインタへのキャストは、切捨てにより実行されます。

  • ポインタ型からそれよりも小さな整数型へのキャストは、切捨てにより実行されます。

  • ポインタ型からそれよりも大きな整数型へのキャストは、ゼロ拡張により実行されます。

  • データポインタと関数ポインタ間のキャストは不正です。

  • 関数ポインタを整数型にキャストすると、結果は不定になります。

  • 符号なし整数型の値からそれよりも大きな型のポインタへのキャストは、ゼロ拡張により実行されます

size_t

size_tsizeof演算子の結果の符号なし整数型です。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と同じです。