ポインターは符号付き整数ではなく、符号なし整数によく似ています。ただし、符号付き整数であるかのように出力しています。int
32 ビット システムでは、 、unsigned int
、float
、およびポインターなど、 32 ビット長である可能性が高いものがいくつか あります。これらは一見しただけでは一般的にはわかりませんが、それぞれ意味が異なります。(実験として、さまざまな整数を渡して float のように出力したり、その逆を行ったりすることができます。これは一般的に悪い習慣ですが、異なるデータ型が異なることを意味することを示すことができます。)
可変数の引数をとる関数 (「可変個」関数) は、複雑な方法でそれを行います。特に、引数の型をチェックしません。好きな引数printf()
や同様の関数を渡すことができますが、それらをフォーマット指定子に一致させるのはあなたの問題です。float
これは、関数が適切な型を取得する方法がないことを意味します (のような関数にa を渡した場合と同様int foo(int)
)。
間違った型の引数を渡すと未定義の動作につながり、特に間違ったサイズの引数を渡すと問題が発生する可能性があります。ほとんどの 64 ビット システムでは、ポインタは 64 ビットで、int
s は 32 です。
したがって、フォーマット文字列で正しいものを使用する必要があります。 printf("%p", &a);
のアドレスをa
ポインタとして出力します。これはあなたが望むものです。標準では のようなものが必要ですprintf("%p", (void *)&a);
が、実際には、遭遇する可能性のあるコンピューターでは不要です。