2017-02-12 7 views
-2
#include<stdio.h> 

int main() 

{ 
    char *p; 
    p="%d\n"; 
    p++; 
    p++; 
    printf(p-2, 400); 
    return 0; 
} 

私は上記のコード実行しているとき、私は出力400しかし、なぜ400を取得していますの出力になりますか?何が次のCプログラム

+1

それ以外は何が得られますか?なぜですか? –

+0

実際、私はprintf()関数の構文をもっと深く認識していませんでした。だから私は自分のコードで何が起きているのか理解していない。 –

答えて

2

printf()の最初のパラメータはフォーマット文字列です。変数pは文字列へのポインタであり、文字列の表現方法も同じです。

pに文字列"%d\n"が割り当てられている場合は、その値を印刷してキャリッジリターン文字を出力するために整数をフォーマットします。

pはcharポインタであるため、p++はポインタを1文字分前方に移動することを意味します。これは、キャリッジリターン文字の先頭を指すように、2文字前にpを移動するために2回実行されます。 p-2は、char*の2文字前にpのポイントを与えるためにポインタ計算を行うと言います。

これは、キャリッジリターン文字列%dの先頭です。これは書式文字列になり、第2のパラメータ400は%dを置き換え、それ自身に続いてキャリッジリターンを出力します。

3

pには、最初に書式設定文字列が割り当てられます。それから、それは1回2回減少します。最後にその値から2を引いたものが、追加のパラメータ400を使用してprintfに渡されます。

pの最新値から2を引いて元の書式設定文字列に戻します。 printfは値400を出力します。

+0

ありがとう@Zbynek。私はポイントを得た。 –

1

文字列へのポインタを宣言し、値"%d\n"を割り当てました。このポインタはメモリ内のアドレスを保持します。

はたとえば、あなたは8

にアドレスを変更し、それはあなたが(あなたは常にあなたのポインタが指している場所を知っている必要がありますを行うべきではありません)、それには2つを追加するときに6に対応するために指して言うことができます今度はprintfをアドレスpの現在の値に置き換えて、(8) - 2の6を指します。

関連する問題