我有这个程序。我有些疑惑。您可以在编译器中运行它。我在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位,在 add
和 &(a[i][j])
的情况下,它以4位的间隙打印地址。
在最后我打印数组的初始地址。这给出了与&a[0][0]
相同的地址。所以问题是哪种方法是正确的,add=&(a[i][j]
;或直接推出a[i][j]
?
答案 0 :(得分:0)
他们是同一个地址。这可能是让你认为自己与众不同的标志。使用%p打印指针或使用%u作为两者。