2017-03-16 16 views
1

私は、次のプログラムを持っている:私は、次のコードの出力を理解するのに苦労し

int main() 
{ 

    char arr[] = "geeksforgeeks"; 

    char *ptr = arr; 

    while(*ptr != '\0') 

     ++*ptr++; 

    printf("%s %s", arr, ptr); 

    getchar(); 

    return 0; 
} 

出力:hffltgpshfflt与え

説明は次のとおりです。

1は、の優先順位と結合を知っている場合演算子はそれからあまり残っていることはありません。以下は演算子の優先順位です。したがって、表現++*ptr++が効果は次の通りです

Postfixx ++   left-to-right 
Prefix ++    right-to-left 
Dereference *   right-to-left 

*ptrの値がインクリメントされ
  • ptrの値がインクリメントされ

このポインタ表現++*ptr++を取得しているか私の質問があります実装され、なぜこの文 "printf("%s %s", arr, ptr);"文字列 "geeksforgeeks"も印刷されませんか? 助けてください。

+0

「geeksforgeeks」はどうやって印刷できますか? '' arr''の全ての文字がインクリメントされ、元の文字列はもう存在しません。 '' ptr''は '' arr''の最後にヌル文字を指してしまうので、空文字列として表示されることに注意してください。 – jasonharper

+0

ポインタptrを使って元のarrを変更したので、変更されたものは "hffltgpshfflt"となります。 @jasonharper –

+0

はい、正確です。 '' ptr''は、 '' arr''の各要素を順番に(最後にヌル文字に達すると停止します)指しています。これらの要素は先頭の '' ++ ''がインクリメントしているものです。 – jasonharper

答えて

0

Answer - >なぜこの文は "printf("%s%s "、arr、ptr);"文字列 "geeksforgeeks"も印刷されませんか?

ここで、arrの配列要素は、1で増分されます。つまり、g + 1 = h、e + 1 = f ....です。これは、ptr値をインクリメントする++ * ptr 。 ptr ++が1だけインクリメントされると、ptrアドレスが '1'だけインクリメントされます。ヌル文字まで。

これは、hffltgpshffltという値を表示し、何も印刷しないNULLを指しているptrを表示しています。 ptrの値を%x形式で0にして確認できます。

関連する問題