4

以下のコードの出力から得たものは*(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;

}
4

2 に答える 2

12

&aは配列のアドレスで、型は「pointer-to- int[5]」です。したがって&a + 1、5 の配列全体で進み、配列のすぐ後ろを指します。

pa同じアドレスを整数の配列(配列ではありません!)内のアドレスとして扱うようになりました。したがって、これは 1 つ過去のポインター と同じですa + 5。1 ずつ減らすと、配列の最後の要素へのポインタが得られます5

*) この種の型のパニングは受け入れられ、配列の基になる型がstandard-layoutである限り、期待どおりの動作をしますint

于 2012-07-30T15:11:51.647 に答える
1

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

于 2012-07-30T15:16:19.617 に答える