ptrdiff_t
From cppreference.com
| ヘッダー <stddef.h> で定義 |
||
| typedef /*実装定義*/ ptrdiff_t; |
||
ptrdiff_t は、2つのポインタを減算した結果の符号付き整数型です。
|
|
(C99以降) (C23まで) |
|
|
(C23以降) |
目次 |
[編集] 注釈
ptrdiff_t は、ポインタ演算や配列インデックス計算で、負の値が発生する可能性がある場合に使用されます。int のような他の型を使用するプログラムは、例えば64ビットシステムでインデックスが INT_MAX を超える場合や、32ビットのモジュラ算術に依存している場合に、失敗する可能性があります。
同じ配列の要素へのポインタ(配列の末尾の次のポインタを含む)のみが相互に減算できます。
配列が非常に大きい(PTRDIFF_MAX 要素より大きいが、SIZE_MAX バイト以下)ため、2つのポインタの差が ptrdiff_t として表現できない場合、これらの2つのポインタを減算した結果は未定義です。
PTRDIFF_MAX より短いchar配列の場合、ptrdiff_t は size_t の符号付き対応として機能します。これは、任意の型の配列のサイズを格納でき、ほとんどのプラットフォームでは intptr_t と同義です。
[編集] 実装の可能性
typedef typeof((int*)nullptr - (int*)nullptr) ptrdiff_t; // valid since C23 |
[編集] 例
このコードを実行
#include <stddef.h> #include <stdint.h> #include <stdio.h> int main(void) { const size_t N = 100; int numbers[N]; printf("PTRDIFF_MAX = %ld\n", PTRDIFF_MAX); int *p1 = &numbers[18], *p2 = &numbers[23]; ptrdiff_t diff = p2 - p1; printf("p2-p1 = %td\n", diff); }
実行結果の例
PTRDIFF_MAX = 9223372036854775807 p2-p1 = 5
[編集] 参考文献
- C23標準 (ISO/IEC 9899:2024)
- 7.19 Common definitions <stddef.h> (p: TBD)
- 7.20.3 その他の整数型の制限 (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.19 共通の定義 <stddef.h> (p: 211)
- 7.20.3 その他の整数型の制限 (p: 215)
- C11標準 (ISO/IEC 9899:2011)
- 7.19 Common definitions <stddef.h> (p: 288)
- 7.20.3 その他の整数型の制限 (p: 293)
- C99標準 (ISO/IEC 9899:1999)
- 7.17 共通定義 <stddef.h> (p: 253)
- 7.18.3 その他の整数型の制限 (p: 258)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.1.6 共通定義 <stddef.h>
[編集] 関連項目
| sizeof 演算子が返す符号無し整数型 (typedef) | |
| 構造体の先頭から指定されたメンバまでのバイトオフセット (function macro) | |
| C++ドキュメント (ptrdiff_t)
| |