2

このケースを考えてみましょう:

int *ptr;
int offset;
ptr = <some_address>;
offset = 10;

offsetが 32 ビット変数であるとします。ptrtype を持ちint*、ターゲット アーキテクチャは 64 ビット ( ptr8 バイト変数も同様) で、offsettype を持ちintます。式の値を計算するときにどのような変換が実行されます*(ptr + offset)か? 2003 C++ 標準のどこでそれについて読むことができますか?

4

1 に答える 1

5

これは、この [expr.add]/4 について標準が言わなければならないことです:

整数型の式をポインターに加算またはポインターから減算すると、結果はポインター オペランドの型になります。ポインター オペランドが配列 object84 の要素を指し、配列が十分に大きい場合、結果は元の要素からオフセットされた要素を指し、結果と元の配列要素の添え字の差が整数式に等しくなります。つまり、式 P が配列オブジェクトの i 番目の要素を指している場合、式 (P)+N (同等に、N+(P)) および (P)-N (N の値は n) が指します。それぞれ、配列オブジェクトの i + n 番目および i ≠ n 番目の要素 (存在する場合) に。

簡単に言えば、これは、を書き込むと、ptrを指すアドレスがインクリメントされることを意味します。offset * sizeof(*ptr)ptr + offset

于 2015-05-07T09:12:20.140 に答える