我有这个程序。我有一些疑问。您可以在编译器中运行它。我在 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
中,占用每个数组元素的地址值,并通过循环一一打印该地址。但是 给出的地址值add
不等于给出的地址值,&(a[i][j])
而这两个给出的值相等。也就是说,对于每个数组元素*add
都等于。*(&(a[i][j]))
有人可以解释一下为什么会这样吗?
我打印了每个元素的大小,以确认内存中数据排列的顺序。由于我的编译器是基于 32 位的,它以 4 位的间隔打印地址,以防add
和&(a[i][j])
.
最后我打印数组的初始地址。这给出了与 相同的地址&a[0][0]
。所以问题是哪种方法是正确的,add=&(a[i][j]
; 或直接输出a[i][j]
?