ポインタから整数への変換、整数からポインタへの変換
ポインタから整数への変換(pointer to integer) 整数からポインタへの変換(integer to pointer)
ポインタ値を整数として扱いたいときの正しい方法について?
intptr_tは符号付き整数型
uintptr_tは符号無し整数型
そもそもなぜintptr_tやuintptr_tが定義されているかは、intやlongは32bit、64bit環境などのアーキテクチャによって型のサイズが変わってしまうので移植性を高めるためにこういう独自の型が出てきた(はず)
printfで書式を指定する場合、inttypes.hをインクルードしてPRIdPTRとかPRIuPTRを使う より詳しい説明は↓を見る
code:pointerIntConv.c
#include <stdint.h> // intptr_t, uintptr_t #include <inttypes.h> // PRIdPTR, PRIuPTR int main() {
int x = 10;
// ポインタ変数
int *p;
// xのアドレスを代入
p = &x;
// pの参照先のxの値を書き換える
*p = 15;
intptr_t ptrVal = (intptr_t)p;
printf("x = %d\n", x);
// %pでアドレスを16進数で表示
printf("&x = %p\n", &x);
printf("p = %p\n", p);
// PRI<出力フォーマット><型>
printf("ptrVal = %" PRIdPTR "\n", ptrVal);
printf("*p = %d\n", *p);
printf("&p = %p\n", &p);
// intptr_t をポインタに戻す
int *p2 = (int *)ptrVal;
printf("p2 = %d\n", *p2);
}
code:memo
code:memo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 591 0 591 0 0 872 0 --:--:-- --:--:-- --:--:-- 874
x = 15
&x = 0x7ffc224f38ec
p = 0x7ffc224f38ec
ptrVal = 140720884103404
*p = 15
&p = 0x7ffc224f38f0
p2 = 15
メモ
7.18.1.4 Integer types capable of holding object pointers
1 The following type designates a signed integer type with the property that any valid
pointer to void can be converted to this type, then converted back to pointer to void,
and the result will compare equal to the original pointer:
intptr_t
The following type designates an unsigned integer type with the property that any valid
pointer to void can be converted to this type, then converted back to pointer to void,
and the result will compare equal to the original pointer:
uintptr_t
These types are optional.
↓
7.18.1.4 オブジェクトポインタを保持できる整数型
1 以下の型は、voidへの有効なポインタをこの型に変換し、voidへのポインタに戻すことができ、その結果は元のポインタと等しく比較されるという特性を持つ符号付き整数型を指定します:
intptr_t
次の型は符号なし整数型で、voidへの有効なポインタをこの型に変換し、voidへのポインタに戻すことができ、その結果は元のポインタと等しく比較されるという特性を持つ:
uintptr_t
これらの型はオプションである。
確認用
Q. ポインタから整数への変換
Q. 整数からポインタへの変換
Q. なぜintptr_t、uintptr_tが定義されているか
関連
参考
メモ
調査用