2

これまでのところ、私が持っているポインター (アドレス) の値を出力するために、(正しくまたは誤って)%u書式指定子を使用しました。この点で、%p指定子とはどういう意味ですか? void*タイプのみのポインターの値を出力しますか? この%p指定子を使用して整数ポインターを出力しようとしましたが、出力は 16 進数値のようです。%p整数または文字ポインター値を出力するために使用するのは間違っていますか? %p書式指定子について教えてください。Web リソースは私を混乱させただけでした。

質問のステートメントは、次のリンクから入手しました。

http://www.macs.hw.ac.uk/~rjp/Coursewww/Cwww/format.html

4

3 に答える 3

4

%u形式はsizeof(void *) == sizeof(unsigned)、通常 32 ビット コードには当てはまりますが、64 ビット コードには当てはまりません。フォーマットを制御したい場合 ( の外観を制御することはできません)、 C99%pから使用することをお勧めします。<inttypes.h>

printf("0x%.8" PRIXPTR "\n", (uintptr_t)&object);

マクロ PRIXPTR は、型の値uintptr_tと変換指定子の正しい長さ修飾子を提供しますX。型uintptr_tは、任意のポインターを保持するのに十分な大きさの整数型です。これ.8により、少なくとも 8 桁の 16 進数が出力されることが保証されますが、アドレスが 64 ビット量であり、値の先頭 (最上位) 32 ビットにビットが設定されている場合はさらに多くなります。

厳密には、 を使用する場合は、(a)キャストによって%pスタック上の値が実際に a であることを確認する必要があります( et al は可変個引数関数であり、変換が自動的に行われないため)、および (b) があるフォーマットのクロスプラットフォーム標準はありません。多くの場合、接頭辞のない小文字の 16 進数と同等です。一部のシステムはプレフィックスを生成します。実際には、通常は安全に.void *fprintf()0x0xint *

理論的には、標準 C では、関数ポインターを出力する方法はありません。関数ポインターがデータ ポインターと同じサイズであるという保証はありません。幸いなことに、POSIX が介入し、POSIX システムでは、関数ポインターはデータ ポインターと同じサイズにする必要があると述べています。したがって、少なくとも Unix システムでは、事実上 Windows システムでは、データ ポインターと関数ポインターを安全に出力できます。

于 2012-09-11T02:20:08.273 に答える
2

はい、ポインタが保持するアドレスを出力するためのものです。任意のポインター型で機能します。

于 2012-09-11T01:57:10.657 に答える
1

void*意味:「メモリ内のどこかへのポインタですが、それがどのタイプのメモリを指しているのかわかりません。」これが、メモリアドレスのみのを気にしないため、%p指定子がである理由です。住所の印刷に使用することを目的としています。一方、 はデータが であることを期待していますが、これは実際には機能する可能性がありますが、とが異なるサイズなどである可能性があるため、使用しないでください。また、他の回答で述べたように、すべてのポインターは に変換可能であり、可変引数関数のファミリーは技術的にこの変換を実行しないため、キャストを行う必要があります。void*%uunsigned intvoid*unsigned intvoid*printfvoid*

printf("%p", (void*)&x);
于 2012-09-11T02:46:36.597 に答える