2011-07-04 116 views
1
#include<stdio.h> 
main 
{ 
    int x[]={1,2,3,4,5}; 
    int i,*j; 
    j=x; 
    for(i=0;i<=4;i++) 
    { 
     printf("%u",j); 
     j++; 
    } 
} 

输出:为什么这个C程序输出是这样的?

65512 
65514 
65516 
65518 
65520 

但是,当我改变printf为”

printf("%u",&j[i]); 

输出是:

65512 
65516 
65520 
65524 
65528 

为什么地址由2在第一壳体和4不同在第二个casee?

刚刚印刷j和印刷&j[i]有什么问题?

回答

0

首先,只是要清楚,要打印指针j,而不是尖锐的价值,*j

现在,关于打印的地址。在你的第二个例子:

for(i=0;i<=4;i++) 
{ 
    printf("%u",&j[i]); 
    j++; 

&j[i]等于(j+i)i在每次迭代中递增,其对于指针的值贡献2,并且j也递增,这贡献了另外的2。

+0

@lgor Oks“j”也是一个地址和“&j [i]”也是一个地址只知道..我打印这两个..为什么地址不同? – debug

+1

我认为他很清楚为什么地址不同。你正在增加'j'和'i',所以显然'j'(你的第一个例子)将会比'j + i'(你的第二个例子)慢。要获得与第一个示例相同的输出,您需要'&j [0]'。 –

3

您在第二个示例中跳转了4次,因为您正在递增j抵消了i!这两者的贡献相差为2.

还要注意printf不是类型安全的;确保参数匹配格式说明符由您决定。您已指定%u,但您已将其指定为int *,您应该使用指针%p

+0

@Oli Charlesworth对不起“j = x”我在代码中忘记了这一行..现在我更新了代码检查......... – debug

+0

注意:有些编译器可能会警告您将错误的参数传递给printf,但是您必须启用警告 –

+0

@debug:查看我更新的答案。 –