我有这个程序。我有一些疑问。你可以在你的编译器中运行它。我在linux为什么指针给出两个不同的地址?
#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;
}
使用gcc编译在此代码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]
?
“%d”或“%u”都不适用于指针。为此,使用'%p'(并转换为'void *')。 – 2013-10-10 15:40:58
另一个是'%d',另一个是'%u'。 – dornhege
地址相同,但表示方式不同。 – deepmax