0

私はこのプログラムを持っています。そして、私はいくつかの疑問を持っています。コンパイラで実行できます。Linuxでgccコンパイラを使用しています

#include<stdio.h>
int main()
{
    int j=4,*add;
    int i=2;
    int a[i][j];
    for (i=0;i<=1;i++)
    {
        for(j=0;j<=3;j++)
        {
            scanf("%d",&a[i][j],"%d",&a[i][j]);
        }
    }
    for(i=0;i<=1;i++)
    {
        for (j=0;j<=3;j++)
        {
            add=&(a[i][j]);
            printf("\nSize of %d is %d and address is: %u that should be equal to: %d",a[i][j],sizeof(a[i][j]),&(a[i][j]),add);//Address are not equal while add is having the value of &(a[i][j])
            printf("\nSize of %d is %d and value is: %d that should be equal to: %d",a[i][j],sizeof(a[i][j]),*(&(a[i][j])),*add);//Here value at both addresses are same
        }
     }

    printf("\n initial address of the array is: %u that should be equal to address given by &a[0][0]",&a); //And it's equal

return 0;
}

このコードaddでは、各配列要素のアドレス値を占有し、ループを通じてそのアドレスを 1 つずつ出力します。しかし、 によって与えられたアドレス値は によって与えられたものaddと等しくありませんが&(a[i][j])、これらの 2 つによって与えられた値は等しいです。つまり、配列要素ごと*addに等しいです。*(&(a[i][j]))これがなぜそうなのか、誰かが私に説明できますか?

メモリ内のデータ配置の順序を確認するために、各要素のサイズを出力しました。add私のコンパイラは32ビットベースであるため、との両方の場合、4ビットのギャップでアドレスを出力しました&(a[i][j])

最後に、配列の初期アドレスを出力します。これにより、 と同じアドレスが得られ&a[0][0]ます。問題は、どの方法が正しいかということadd=&(a[i][j]です。a[i][j]または、 ?を付けて直接出力します。

4

1 に答える 1

0

それらは同じアドレスです。違うと思わせるサインかもしれません。%p を使用してポインターを出力するか、両方に %u を使用します。

于 2013-10-10T15:53:53.940 に答える