3

ポインターへのポインターでポインター演算を使用することは明確に定義されていますか? 例えば

int a=some_value;
int* p=&a;
int**p2=&p;

p2 で算術演算を実行することは、明確に定義された動作でしょうか? (例: p2+1、p2+2 など)

4

2 に答える 2

3

他の答えは完全に間違っています:

int *p = &a;

単一のポインター変数 (ポインターの配列ではない) を宣言します。これは、単一の要素を持つ配列を使用した同等の WRT インデックスです。

int *(array[1]) = { &a };

(&array[0]) + 1or array + 1、 orを実行できます。これはp + 1、末尾の 1 つ後のポインターの形成が許可されているためです。末尾の 1 つ後のポインターは、配列の末尾の直後にある架空の要素を指します。1 つ過去のポインターは、実際のオブジェクトを指していないため、逆参照できません。

しかし、他のポインター値を計算することはできません

特に、p+2無効です。

于 2011-11-27T12:52:26.460 に答える
1

もちろん!

p + n

wherepはポインタでnあり、integer は常に明確に定義されています。それ自体から、「pが指す要素型のサイズのn倍」バイトのアドレスを生成しますp。この場合p2、ポインタへのポインタです。「4 * the-size-of- pointers p2 + 4」バイトを過ぎたアドレスも同様p2です。

特定の例でローカル変数を指しているので、奇妙になります。でも違法にはなりません。

于 2011-10-06T06:35:28.130 に答える