20

次のコードで指定子%pと動作はどのようになっていますか?%Fp

void main() 
{
    int i=85;

    printf("%p %Fp",i,i);

    getch();   
}

私はo / pを取得しています 0000000000000055 0000000000000055

4

6 に答える 6

28

これがあなたの求めているものである場合、 %p と %Fp はポインター、特にポインターが参照するアドレスを出力します。これはコンピューターのアーキテクチャの一部を出力しているため、16 進数で出力します。

C では、ポインターと int の間でキャストできます。ポインターは、前述のメモリのチャンクを参照する 32 ビットまたは 64 ビットの数値 (マシンのアーキテクチャによって異なります) であるためです。

そしてもちろん、16 進数で 55 は 10 進数で 85 です。

于 2012-09-28T03:17:10.350 に答える
2

%p はポインタ アドレスを出力するためのものです。

10 進数で 85 は 16 進数で 55 です。

システムのポインターは 64 ビットなので、完全な 16 進数表現は次のようになります: 0000000000000055

于 2012-09-28T03:14:03.753 に答える
2

私のマシンからのコンパイル出力は次のとおりです。

format.c:7:5: 警告: フォーマット '%p' はタイプ 'void *' の引数を期待していますが、引数 2 のタイプは 'int' です [-Wformat]

format.c:7:5: 警告: フォーマット '%F' には 'double' 型の引数が必要ですが、引数 3 の型は 'int' です [-Wformat]

したがって、警告はありますが、コンパイルは行われ、出力は次のようになります: 0x55 0.000000p

あなたが最後にapを取得していないことに驚いています. コードと出力が一致していますか? i のアドレスが 0x0...055 であることは不可能ではないと思いますが、ここで何かがおかしいようです。

ところで: %p の一般的な使用法は、int ではなく &i などのアドレスを出力することです。

于 2012-09-28T04:19:02.317 に答える
2

その目的は、ポインター値を実装定義の形式で出力することです。対応する引数はvoid *値でなければなりません。

また%p、アドレスがシステムビットに依存しているポインターのアドレスを出力するために使用されます。

于 2012-09-28T05:18:44.797 に答える