1. ホーム
  2. c

[解決済み] ポインタ算術【閉

2022-03-04 18:02:24

質問

どなたかポインタ演算の良い記事、解説(ブログ、例題)をお持ちの方はいらっしゃいませんか? 読者はCやC++を学んでいるJavaプログラマーの一団です。

どのように解決するのですか?

まず ビンキー の動画が参考になるかもしれません。ポインターについての素敵なビデオです。算術演算については、以下のような例があります。

int * pa = NULL;
int * pb = NULL;
pa += 1; // pa++. behind the scenes, add sizeof(int) bytes
assert((pa - pb) == 1);

print_out(pa); // possibly outputs 0x4
print_out(pb); // possibly outputs 0x0 (if NULL is actually bit-wise 0x0)

<サブ (厳密にはNULLポインタの値を含むポインタをインクリメントすることは未定義の動作であることに注意してください。NULLを使ったのは、ポインタの値にしか興味がなかったからです。通常は、配列の要素を指す場合にのみ、increment/decrementを使用します)。

以下は、2つの重要な概念を示しています。

  • ポインタに整数を加算/減算することは、ポインタをN要素分前進/後退させることを意味します。つまり、intが4バイトの場合、我々のプラットフォームでは、1増加した後に0x4が格納されることになります。
  • あるポインタから別のポインタを引くことは、その距離を要素数で測定することを意味します。つまり、paからpbを引くと、両者の距離は1要素であるため、1が得られます。

実際の例について。あなたが関数を書き、人々が開始と終了のポインタを提供したとします(C++では非常に一般的なことです)。

void mutate_them(int *begin, int *end) {
    // get the amount of elements
    ptrdiff_t n = end - begin;
    // allocate space for n elements to do something...
    // then iterate. increment begin until it hits end
    while(begin != end) {
        // do something
        begin++;
    }
}

ptrdiff_t は、(end - begin)の型が何であるかということです。あるコンパイラではint"の同義語かもしれませんし、別のコンパイラでは別の型かもしれません。しかし、それはわからない。そこで、一般的な型定義である ptrdiff_t .