2

次のコードがあります。

#include <iostream>
using namespace std;
int main()
{
    int g[] = {9,8};
    int (*j)[2] = &g;
    cout << "*(j):" << *(j) << endl;
    cout << "j:" << j << endl;
    cout << "&j:" << &j << endl;
    cout << "&(*j)" << &(*j) << endl;
    cout << "*(*j):" << *(*j) << endl;
    return 0;
}

出力:

*(j):0x7fff5ab37c7c
j:0x7fff5ab37c7c
&j:0x7fff5ab37c70
&(*j)0x7fff5ab37c7c
*(*j):9

j は 2 つの整数の配列へのポインタだと思います。

&g は配列全体のアドレスです。

次に、配列全体のアドレスを保存します。

したがって、*(j) を使用すると、配列の最初の要素が逆参照されます。

しかし、結果は、*(j) が j と同じ値の配列アドレスを格納することを示しています。

これがどのように起こったのかわかりません。

4

2 に答える 2

3

j は 2 つの整数の配列へのポインタだと思います。
&g は配列全体のアドレスです。

それは正しいです。

したがって、*(j) を使用すると、配列の最初の要素が逆参照されます。

これではありません。*j配列自体を提供します。に挿入するとcout、再びポインターに減衰し (今回は最初の要素である type へのポインターint*)、その値が出力されます。

と書いたのと実質的には同じですcout << g

于 2013-10-27T16:14:10.360 に答える
2

j「配列へのポインタだと思います」

はい、そうです*jそしてそれが、出力するのと同じアドレスを出力する理由でもありgます。この場合、配列はポインターに崩壊するため、出力してもj同じ結果が得られます。

j同じアドレスが出力されるということは、と*jが同じポインタだと思われるかもしれませんが、そうではありません。それらのタイプは異なります (実際に重要な事実です):

int g[] = {9,8};     // int[]
int (*j)[2] = &g;    // int (*)[2]

そのため、 usingは直接使用する*jことと同等になり、同様に と同等になります。 Andは、配列のアドレス (decayed から取得したアドレス、つまり、この配列の最初の要素のアドレス)で初期化される に他なりません。g*(*j)*g
&(*j)jg

では、なぜjand*jは同じアドレスを*(*j)出力し、最初の要素の値を出力するのでしょうか?

j存在のタイプのためint (*)[2]。簡単な例:

int g[] = {9,8};
int (*j)[2] = &g;     // j points to the first element as well
cout << *((int*) j);

出力します9

于 2013-10-27T16:15:45.433 に答える