2011-02-16 24 views
2
#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char a[]="shevchenko ac milan"; 
printf("%s",&a); 
} 

これは版画 "シェフチェンコACミラン"C文字列を印刷ジャンク文字

but 
#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char a[]="shevchenko ac milan"; 
printf("%s",&a+1); 
} 

なぜこの印刷ジャンク文字のでしょうか?

答えて

10

&achar[20]へのタイプのポインタです。

&a+1を実行すると、メモリ内の次のchar[20]アイテムに移動するため、aに進みます。

代わりにchar*が必要です。1を加算すると、次のcharに移動します。

あなただけの次の文字を行くために(それがこれを行うことにより、char*に減衰する)aを使用するため、a+1できchar*を得ました。

3

&a)のアドレスを渡す必要はありません。文字列はcharの配列なので、aはすでにアドレスです。試してみてください:

char a[]="shevchenko ac milan"; printf("%s", a); 

char a[]="shevchenko ac milan"; printf("%s", a+1); 
+0

はい、私は理由を知りたいのですが、2番目のケースでは、ジャンク文字が表示されます –

+0

hevchenko ac milanを期待していますか? –

+0

@karthik A: "&a"は20 -character配列に移動し、ジャンプします。あなたは 'print **'に 'char **'型(二重ポインタ)を渡しているので、 'a'は' char * 'を渡すべきではありません。だから、この答えはあなたがそれを助けるのにぴったりです。 –

0

「アドレスを指すアドレス」をインクリメントすると、割り当てられていない値が得られます。 fbreretoが正しい場合は、ポインタを最初の位置に渡すだけで、+ 1が配列の2番目の位置を指すようにする必要があります。

1

これは、& a + 1と言うとき、ポインタが文字列の最後より1つ先に届くために起こります。 これはポインタの基本的な操作です。整数配列についてもこれを確認できます。

int a[]={1,2,3,4,5};

printf("%d",&a+1);は常にゴミ値を印刷します。それが今が実際にthere.Thusごみ値が印刷されますではありません次の1次元配列を指すように行くのでしょうです