ポインタアドレスを出力する場合の%d
と%u
の違いは何ですか?
例えば:
int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"
このページ でフォーマットエスケープのリストを見つけることができます。
%d
は符号付き整数ですが、%u
は符号なし整数です。ポインタ(数値として扱う場合)は通常、負ではありません。
実際にポインタを表示したい場合は、%p
フォーマット指定子。
%u符号なし整数を出力します
%dは符号付き整数を出力します
ポインタアドレスを取得するには、%pを使用します
書式設定エスケープの完全なリストを以下に示します。 このページ のスクリーンショットを提供しています。
あなたの質問を正しく理解できれば、%p
は、ポインタが使用しているアドレスを表示します。次に例を示します。
int main() {
int a = 5;
int *p = &a;
printf("%d, %u, %p", p, p, p);
return 0;
}
次のようなものを出力します:
-1083791044, 3211176252, 0xbf66a93c
%uは、符号なし整数に使用されます。符号付き整数アドレス演算子%dによって指定されるメモリアドレスは-12なので、この値を符号なし整数で取得するために、コンパイラはこのアドレスの符号なし整数値を返します。
違いは単純です。コンパイル時に異なる警告メッセージが表示されます。
1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("memory address = %d\n", &a); // prints "memory add=-12"
^
1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("memory address = %u\n", &a); // prints "memory add=65456"
^
ポインタをvoid*
として渡し、%p
を変換指定子として使用すると、エラーメッセージは表示されません。
#include <stdio.h>
int main()
{
int a = 5;
// check the memory address
printf("memory address = %d\n", &a); /* wrong */
printf("memory address = %u\n", &a); /* wrong */
printf("memory address = %p\n", (void*)&a); /* right */
}