以下のコードの出力から得たものは*(pa-1)=5:なぜそうですか?
#include<iostream>
using namespace std;
int main(){
int a[5]={1,2,3,4,5};
int *pa=(int *)(&a+1);
cout<<"*(pa-1)="<<*(pa-1)<<endl;
}
以下のコードの出力から得たものは*(pa-1)=5:なぜそうですか?
#include<iostream>
using namespace std;
int main(){
int a[5]={1,2,3,4,5};
int *pa=(int *)(&a+1);
cout<<"*(pa-1)="<<*(pa-1)<<endl;
}
&aは配列のアドレスで、型は「pointer-to- int[5]」です。したがって&a + 1、5 の配列全体で進み、配列のすぐ後ろを指します。
pa同じアドレスを整数の配列(配列ではありません!)内のアドレスとして扱うようになりました。したがって、これは 1 つ過去のポインター と同じですa + 5。1 ずつ減らすと、配列の最後の要素へのポインタが得られます5。
*) この種の型のパニングは受け入れられ、配列の基になる型がstandard-layoutである限り、期待どおりの動作をしますint。
他に何を期待しますか? &atypeint (*)[5]を持っているので、 ;の次を&a + 1指します。これは、要素を反復するための古典的な「終了」イテレータです。次に、にアクセスし
、それにアクセスします。正式には、あなたのコードには未定義の動作があると思います.aの結果に対して合法的にできることは、元の型にキャストすることだけだからです。(文字型へのポインターが関係する例外があります。) 実際には、さまざまな要件が標準全体に広がっているため、 の最後のアドレスを取得する必要があります。int[5]aint[5]reinterpret_castint*reinterpret_castinta