2017-07-20 7 views
3
int main(){ 
    int a[4] = { 1,2,3,4 }; 
    int(*b)[4] = &a; //with a doesn't work 
    cout << a << &a << endl; //the same address is displayed 
} 

したがって、int(*b)[4]は、intの配列へのポインタです。私は&aaの両方で初期化しようとしました。それは最初の人とだけ働く。
配列の最初の要素の両方のアドレスではありませんか?
intの配列へのC++ポインタ

+0

"インスタンス化"ではなく "初期化"を意味します –

+0

ポインタには型があります。 (つまり、アドレスとタイプです)。これは 'int x;と同じ理由で動作しません。ダブル* p =&x; 'は動作しません。 –

+0

@P。 Danielski:「配列の最初の要素のアドレス」と「配列全体のアドレス」は、どちらもメモリ上の同じポイントから始まる場合はどのように区別しますか?同様の例: 'struct S {int x; } s; '。 '&s'と'&s.x'は同じ数値アドレスです。それでは、 '&s'とは何ですか?structオブジェクト全体のアドレスまたは最初のフィールドのアドレス? – AnT

答えて

6

概念的には同じものではありません。同じアドレスを指していても、互換性のないポインタ型なので、その使い方も異なります。

&aがタイプint [4]の配列のアドレスをとっている場合は、配列へのポインタ(つまり、int (*)[4])を意味します。

aここではarray-to-pointer decayとなるため、int(つまりint*)へのポインタを意味します。

0

はあなたがint(*b)int(*b)[0]a[0]に等しいことを知っている必要があり、コード

int a[4] = { 1, 2, 3, 4 } // array 
int(*b) = a // pointer to the first element of the array 

のこの作品を見てみましょう。 したがって、整数の配列を指すポインタではなく、(int*)の整数を指すポインタです。

あなたのケースでどのようにタイプの問題が起こるか。

注意してくださいCは、強力なタイプの言語です。あなたの代入文を見てください。

int(*b)[4] = &a; 

パラメータはint(*ptr)[4]です。これは、そのタイプの引数を厳密に渡さなければならないことを意味します。これはint *です。

そして、配列のポインタを4 intからint *に渡そうとしています。したがって、割り当てには互換性がなく、アドレスも同じです。

関連する問題