2011-07-04 10 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なぜ第2のケースでは?

j&j[i]を印刷するだけで何が問題になりますか?

答えて

0

まず、ちょうどそれを明確にするために、あなたが印刷されたアドレスについては、今、尖った値*j

をポインタjを印刷し、されていません。 2番目の例では:

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

&j[i](j+i)に等しいです。 iは各繰り返しでインクリメントされ、ポインタの値に2が加算され、jもインクリメントされ、2が加算されます。

+0

@lork Oks "j"は住所でもあり "&j [i]"は住所だけです。なぜ住所が違いますか? – debug

+1

私は彼が住所がなぜ違うのかについてかなり明確だったと思います。 'j'と' i'の両方をインクリメントしているので、 'j'(あなたの最初の例)は' j + i'よりも遅くなります(2番目の例)。最初の例と同じ出力を得るには、 '&j [0]'が必要です。 –

3

jのオフセットをiで増やしているため、2番目の例でジャンプが4になります。どちらも2の差になります。printfはタイプセーフではありません。引数が書式指定子と一致することを確認するのはあなた次第です。 %uを指定しましたが、int *と指定した場合は、ポインタに%pを使用してください。

+0

@Oli Charlesworth申し訳ありません「j = x」コード内でこの行を忘れました。コードをチェックしてください......... – debug

+0

注:いくつかのコンパイラはprintfに間違った引数を渡すことについて警告することができますが、警告を有効にする必要があります –

+0

@debug:私の更新された答えを見てください。 –