3
main()
{
    int a[3][2] = { {1,2},{3,4},{5,6}};
    for(int i=0;i<3;i++)
        for(int j=0;j<2;j++)
    {
        printf("%d", a[i][j]);
        printf("\t %d\n", &a[i][j]);
    }
    printf("\n%d", *(a+1));
    printf("\n%d", *a+1);
}

*(a+1) の出力は *a+1 とは異なります。

*(a+1) は 3 番目の要素を指していますが、

*a+1 は 2 番目の値を出力しています

4

4 に答える 4

6

*(a+1) の出力は *a+1 とは異なります。

はい、演算子の優先順位によります。 *a + 1意味...

逆参照a(これは を返しますint) に追加1します。結果を返す ( 2)

しかし、*(a + 1)言う...

ポインタに追加1して逆参照します。つまり、アドレスの値を取得します。 aa + sizeof(int[2])

"value* はたまたま 2 番目の配列の最初の要素になります。覚えておいてください。ポインター型にnを追加すると、アドレスがn 要素分進みます。この場合、各要素は、intそれ自身の 2 つの要素を持つ の配列です。

これで、次の 2 つの質問にも答えられるはずです。演算子の優先順位について調べた後、ポインター演算の学習を開始します。

于 2012-08-28T04:35:50.067 に答える
4

C には実際には多次元配列はなく、配列の配列があります。int a[3][2]要素が int の 2 次元配列である 3 要素配列を宣言します。

ポインターの算術演算はこれを考慮に入れ、ポインターが指すオブジェクトのサイズだけインクリメントします。そのため、配列へのポインタである(a+1)の 2 番目の要素に評価されます。このポインターを介して間接的に指定すると、最初の要素である 3 が取得されます。a{3, 4}

*a一方、 の最初の要素へのポインターを介して間接的aに評価され、1 に評価されます。次に、これに 1 を追加すると、2 が得られます。実際には 2 番目の要素を返すのではなく、1+1 = 2 であるため、そのように見えます。初期化を次のように変更してみてください。

int a[3][2] = { {1,3},{5,7},{9,11}};

出力は 5 と 2 になります。

于 2012-08-28T04:43:08.380 に答える
1

演算子の優先順位について読む必要があります。2 番目のケース*a+1では、単項演算子*は 2 項演算子よりも多くをバインドします+。したがって、演算は が指す値に 1 を加算するように処理されaます。

前者の場合*(a+1)、 が指す次の要素をアドレス指定し、aそれを逆参照してその値を取得します。

HTH。

于 2012-08-28T04:34:51.907 に答える
0

それは正解です。2D 配列は 1D 配列の配列を表すため、この場合、 配列のa[3][2] = { {1,2},{3,4},{5,6}}名前 は配列の0番目の要素として機能します。2 次元配列の 0 番目の要素は 2 つの整数 {1,2}の 1 次元配列で(a+1)あるため、2 次元配列の最初の要素のアドレスを参照し{3,4}、*(a+1) はそのアドレスの値、つまり 3 を与えます。一方、*a は最初の要素へのアクセスを提供し、それを 1 ずつ増やして 2 を与えます。

于 2012-08-28T18:03:37.290 に答える