web-dev-qa-db-ja.com

cの%p形式指定子

指定子はどうですか%pおよび%Fp次のコードで動作しますか?

void main() 
{
    int i=85;

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

    getch();   
}

私はo/pを0000000000000055 0000000000000055

13
poorvank

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

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

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

20
David Christo

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

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

システム上のポインターは64ビットなので、完全な16進数表現は0000000000000055です。

2
Myforwik

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

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

2
reegan vijay

これが私のマシンからのコンパイル出力です:

format.c:7:5:警告:形式 '%p'はタイプ 'void *'の引数を期待しますが、引数2はタイプ 'int'を持ちます[-Wformat]

format.c:7:5:警告:形式 '%F'はタイプ 'double'の引数を想定していますが、引数3はタイプ 'int'を持っています[-Wformat]

したがって、警告はありますが、コンパイルは実行され、出力は0x55 0.000000pです。

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

btw:%pの典型的な使用法は、アドレスを印刷することです。つまり、intではなく&iです。

2
user657862

@Myforwikが言ったことへの追加

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

%Fpは、おそらく->(0x1234:0x5678)の形式のFARポインターをフォーマットするために使用されます

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

今は大丈夫だと思います。

参照: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.htmlhttp://www.winehq .org/pipermail/wine-devel/2005-March/034390.html

1
Saurabh Rana