Namespaces
Variants

std:: ptrdiff_t

From cppreference.net
Utilities library
ヘッダーで定義 <cstddef>
typedef /*implementation-defined*/ ptrdiff_t ;

std::ptrdiff_t は2つのポインタの減算結果の符号付き整数型です。

std::ptrdiff_t のビット幅は17以上である。

(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つのポインタを減算した結果は未定義です。

char配列が PTRDIFF_MAX より短い場合、 std::ptrdiff_t std::size_t の符号付き対応物として機能します:あらゆる型の配列のサイズを格納でき、ほとんどのプラットフォームでは std::intptr_t と同義です。

std::ptrdiff_t の宣言が他の標準ライブラリヘッダで利用可能かどうかは未規定です。実装は、規格が std::ptrdiff_t の使用を要求する場合であっても、この名前を導入しないことを選択できます。

実装例

// 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)
standard-layout 型の先頭から指定されたメンバーまでのバイトオフセット
(関数マクロ)
Cドキュメント for ptrdiff_t