std::ptrdiff_t
From cppreference.com
| ヘッダ <cstddef> で定義 |
||
| typedef /*実装定義*/ ptrdiff_t; |
||
std::ptrdiff_tは、2つのポインタを減算した結果の符号付き整数型です。
|
|
(C++11以降) |
目次 |
[編集] 注意
std::ptrdiff_tは、負の値の可能性がある場合、ポインタ演算および配列インデックスに使用されます。intのような他の型を使用するプログラムは、例えば64ビットシステムでインデックスがINT_MAXを超えた場合や、32ビットモジュラ演算に依存している場合に失敗する可能性があります。
C++コンテナライブラリを扱う場合、イテレータ間の差の適切な型はメンバtypedefであるdifference_typeであり、これはしばしばstd::ptrdiff_tと同義です。
同じ配列の要素へのポインタ(配列の末尾の1つ後のポインタを含む)のみがお互いに減算できます。
配列が非常に大きく(PTRDIFF_MAX要素より大きいが、SIZE_MAXバイト未満)、2つのポインタの差がstd::ptrdiff_tとして表現できない場合、そのような2つのポインタを減算した結果は未定義です。
PTRDIFF_MAXより短いchar配列の場合、std::ptrdiff_tはstd::size_tの符号付き対応として機能します。これは、あらゆる型の配列のサイズを格納でき、ほとんどのプラットフォームではstd::intptr_tと同義です。
std::ptrdiff_tの宣言が他の標準ライブラリヘッダーで利用可能であるかどうかは未指定です。実装は、標準がstd::ptrdiff_tの使用を要求する場合でも、この名前を導入しない場合があります。
[編集] 実装例
// valid since C++11 using ptrdiff_t = decltype(static_cast<int*>(nullptr) - static_cast<int*>(nullptr)); |
[編集] 例
このコードを実行
#include <cstddef> #include <iostream> int main() { const std::size_t N = 10; int* a = new int[N]; int* end = a + N; for (std::ptrdiff_t i = N; i > 0; --i) std::cout << (*(end - i) = i) << ' '; std::cout << '\n'; delete[] a; }
出力
10 9 8 7 6 5 4 3 2 1
[編集] 関連項目
| sizeof 演算子が返す符号無し整数型 (typedef) | |
| 標準レイアウト型の先頭から指定されたメンバまでのバイトオフセット (関数マクロ) | |
| C言語のドキュメント (ptrdiff_t)
| |