私はこのプログラムを持っています。そして、私はいくつかの疑問を持っています。コンパイラで実行できます。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]
または、 ?を付けて直接出力します。