ポインターへのポインターでポインター演算を使用することは明確に定義されていますか? 例えば
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]) + 1or 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です。
特定の例でローカル変数を指しているので、奇妙になります。でも違法にはなりません。