次のコードで指定子%p
と動作はどのようになっていますか?%Fp
void main()
{
int i=85;
printf("%p %Fp",i,i);
getch();
}
私はo / pを取得しています 0000000000000055 0000000000000055
次のコードで指定子%p
と動作はどのようになっていますか?%Fp
void main()
{
int i=85;
printf("%p %Fp",i,i);
getch();
}
私はo / pを取得しています 0000000000000055 0000000000000055
これがあなたの求めているものである場合、 %p と %Fp はポインター、特にポインターが参照するアドレスを出力します。これはコンピューターのアーキテクチャの一部を出力しているため、16 進数で出力します。
C では、ポインターと int の間でキャストできます。ポインターは、前述のメモリのチャンクを参照する 32 ビットまたは 64 ビットの数値 (マシンのアーキテクチャによって異なります) であるためです。
そしてもちろん、16 進数で 55 は 10 進数で 85 です。
%p はポインタ アドレスを出力するためのものです。
10 進数で 85 は 16 進数で 55 です。
システムのポインターは 64 ビットなので、完全な 16 進数表現は次のようになります: 0000000000000055
私のマシンからのコンパイル出力は次のとおりです。
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 などのアドレスを出力することです。
その目的は、ポインター値を実装定義の形式で出力することです。対応する引数はvoid *
値でなければなりません。
また%p
、アドレスがシステムビットに依存しているポインターのアドレスを出力するために使用されます。