0
int s[4][2]= {
             {1234,56},
             {1212,33},
             {1434,80},
             {1312,78}
             };
int i,j;
for(i=0;i<=3;i++)
{
    printf("\n");
    for(j=0;j<=1;j++)
    {
        printf("%d  ",*(s[i]+j));
    }
}

出力表示は

1234,56
1212,33
1434,80
1312,78

私たちが知っている*(&Variable)ように、変数の値を出力しますが、上記のプログラムで同じ概念を実装すると...

int s[4][2]= {
             {1234,56},
             {1212,33},
             {1434,80},
             {1312,78}
             };
int i,j;
for(i=0;i<=3;i++)
{
    printf("\n");
    for(j=0;j<=1;j++)
    {
        printf("%d  ",*(&s[i]+j));
    }
}

出力は、配列の各要素のアドレスを示しています。

なぜこれが起こっているのですか?出力が配列の要素の値と等しくないのはなぜですか??

4

3 に答える 3

2
于 2016-09-21T07:23:18.607 に答える
0

最初のケース

あなたのプリントステートメントはこれです。

printf("%d  ",*(s[i]+j));

ここで、s[i]+j はアドレスです。

i=0,j=1 、最初の i ループ、2 番目の j ループを考えてみましょう。

ここで、s[i] は値 1234 が存在するアドレスになります。489000 としましょう。したがって s[i]+j 、ここで s[0]+1 は値 56 が存在するアドレスになります。489004だとしましょう

したがって、 *(s[i]+j) 、すなわち; ここで *(s[0]+1) は、アドレス 489004 の値、つまり 56 を提供します。したがって、ここでは値 1234、56、1212 などを出力します。

2 番目のケース print ステートメントは次のとおりです。

printf("%d  ",*(&s[i]+j));

&s[i]+j はアドレスです。

i=0,j=0 、最初の i ループ、最初の j ループを考えてみましょう。

ここで、s[i] は値 1234 が存在するアドレスになります。489000 としましょう。したがって、&s[i] は、アドレス 489000 が存在するアドレスになります。380000 としましょう。ポインタの概念を思い出してください。

したがって、 &s[i]+j は「アドレス 489000 が存在するアドレス + j」 になります。すなわち; 380000+j

取得したこの特定の「アドレス」の演算子 * に値を適用しています。*(&s[i]+j)。つまり、 Value at['アドレス 489000 が存在するアドレス' + j] となります。[380000 + j] の値。

i=0,j=0 の場合、Value At[380000] が出力されます。489000。

したがって、値 1234 、 56 、 1212 などが格納されているアドレスが出力されます。

于 2016-09-21T10:56:12.570 に答える
0

あなたの配列は二次元です。つまり、s[i]は行のアドレスi(つまりs[i]は タイプint *) であり、&s[i]はアドレスのアドレス (つまり タイプint **) です。それに申し込む*と、住所(すなわちint *)が得られます。

&演算子が「address-of」を*(&x)意味し、 の値を参照することは事実ですx

于 2016-09-21T07:22:35.467 に答える