0

我有这个程序。我有一些疑问。你可以在你的编译器中运行它。我在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]

+7

“%d”或“%u”都不适用于指针。为此,使用'%p'(并转换为'void *')。 – 2013-10-10 15:40:58

+0

另一个是'%d',另一个是'%u'。 – dornhege

+3

地址相同,但表示方式不同。 – deepmax

回答

0

它们是相同的地址。这可能是让你认为他们不同的标志。使用%p打印指针或为两者使用%u。

+0

非常感谢Tristan。 :) 你是对的。我也使用%u作为** add **。两者的地址都相同。 但现在的问题是为什么%d给出了-ve地址。我知道它用于整型变量而不是整型指针。那么再次感谢你。 :) –

+0

非常感谢你,我用%u代替了两个地址,地址也一样。 –

+0

使用%u和%p做不同的事情。两者都给出指针的地址。但是一个以整数形式给出的地址在0axtu23i90中给出了这样的东西。所以使用%u我们可以添加/减少地址。 –

相关问题