以下のコードの出力から得たものは*(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
。
他に何を期待しますか? &a
typeint (*)[5]
を持っているので、 ;の次を&a + 1
指します。これは、要素を反復するための古典的な「終了」イテレータです。次に、にアクセスし
、それにアクセスします。正式には、あなたのコードには未定義の動作があると思います.aの結果に対して合法的にできることは、元の型にキャストすることだけだからです。(文字型へのポインターが関係する例外があります。) 実際には、さまざまな要件が標準全体に広がっているため、 の最後のアドレスを取得する必要があります。int[5]
a
int[5]
reinterpret_cast
int*
reinterpret_cast
int
a