ポインターへのポインターでポインター演算を使用することは明確に定義されていますか? 例えば
int a=some_value;
int* p=&a;
int**p2=&p;
p2 で算術演算を実行することは、明確に定義された動作でしょうか? (例: p2+1、p2+2 など)
ポインターへのポインターでポインター演算を使用することは明確に定義されていますか? 例えば
int a=some_value;
int* p=&a;
int**p2=&p;
p2 で算術演算を実行することは、明確に定義された動作でしょうか? (例: p2+1、p2+2 など)
他の答えは完全に間違っています:
int *p = &a;
単一のポインター変数 (ポインターの配列ではない) を宣言します。これは、単一の要素を持つ配列を使用した同等の WRT インデックスです。
int *(array[1]) = { &a };
(&array[0]) + 1
or array + 1
、 orを実行できます。これはp + 1
、末尾の 1 つ後のポインターの形成が許可されているためです。末尾の 1 つ後のポインターは、配列の末尾の直後にある架空の要素を指します。1 つ過去のポインターは、実際のオブジェクトを指していないため、逆参照できません。
しかし、他のポインター値を計算することはできません。
特に、p+2
は無効です。
もちろん!
p + n
wherep
はポインタでn
あり、integer は常に明確に定義されています。それ自体から、「pが指す要素型のサイズのn倍」バイトのアドレスを生成しますp
。この場合p2
、ポインタへのポインタです。「4 * the-size-of- pointers p2 + 4
」バイトを過ぎたアドレスも同様p2
です。
特定の例でローカル変数を指しているので、奇妙になります。でも違法にはなりません。