Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用%x打印指针中包含的十六进制地址_C_Pointers_Memory Address - Fatal编程技术网

C 使用%x打印指针中包含的十六进制地址

C 使用%x打印指针中包含的十六进制地址,c,pointers,memory-address,C,Pointers,Memory Address,我刚刚读了这篇短文,它很好地描述了指针。然而,作者说地址就是这些十六进制值,所以他用%x打印它,但当我这样做时,编译器不仅会警告我传递的是指针,而不是无符号的int,有时还会得到与地址根本不相似的东西(如1C)。谁能澄清一下这个问题吗?%x用于以十六进制打印值。虽然指针通常是用十六进制编写的,但对于使%x不匹配的指针,还有其他一些需要考虑的问题,如您看到的1C输出 %p用于指针,可能正是您要查找的内容。它将更好地格式化指针,因为它知道它是指针 1C是一个非常有效的十六进制输出,但是对于指针来说这

我刚刚读了这篇短文,它很好地描述了指针。然而,作者说地址就是这些十六进制值,所以他用%x打印它,但当我这样做时,编译器不仅会警告我传递的是指针,而不是无符号的int,有时还会得到与地址根本不相似的东西(如1C)。谁能澄清一下这个问题吗?

%x
用于以十六进制打印值。虽然指针通常是用十六进制编写的,但对于使
%x
不匹配的指针,还有其他一些需要考虑的问题,如您看到的
1C
输出

%p
用于指针,可能正是您要查找的内容。它将更好地格式化指针,因为它知道它是指针

1C
是一个非常有效的十六进制输出,但是对于指针来说这是很奇怪的,因为您希望在显示指针时发生某些特殊的事情,比如具有正确的长度


由于
%x
表示十六进制数,因此向其中传递指针将发出警告。它给出警告的一个原因是指针的大小不一定与无符号int相同。

%x
用于以十六进制打印值。虽然指针通常是用十六进制编写的,但对于使
%x
不匹配的指针,还有其他一些需要考虑的问题,如您看到的
1C
输出

%p
用于指针,可能正是您要查找的内容。它将更好地格式化指针,因为它知道它是指针

1C
是一个非常有效的十六进制输出,但是对于指针来说这是很奇怪的,因为您希望在显示指针时发生某些特殊的事情,比如具有正确的长度


由于
%x
表示十六进制数,因此向其中传递指针将发出警告。它给出警告的一个原因是指针的大小不一定与无符号int相同。

%x
需要
无符号int
,传递任何其他内容都是UB

对于打印数据指针,有
%p
可以打印void指针(类型
void*
,转换不是可选的),通常使用十六进制表示法打印

如果您不满意,请考虑将指针转换为<代码> uTutpTrpT,并使用格式说明符宏>代码> PrxPPTR 或<代码> PrxPPTR <代码> > <代码> <代码>,以保证十六进制输出。


您甚至可以选择使用的大小写。

%x
需要一个
无符号int
,传递任何其他内容都是UB

对于打印数据指针,有
%p
可以打印void指针(类型
void*
,转换不是可选的),通常使用十六进制表示法打印

如果您不满意,请考虑将指针转换为<代码> uTutpTrpT,并使用格式说明符宏>代码> PrxPPTR 或<代码> PrxPPTR <代码> > <代码> <代码>,以保证十六进制输出。


您甚至可以选择所使用的大小写。

%x
希望其相应的参数具有类型
unsigned int
,这就是您获得警告和时髦输出的原因。使用
%p
显示指针值:

T *p = some_pointer_value;
...
printf( "p = %p\n", (void *) p );
%p
要求其相应的参数具有类型
void*
。在C语言中,这几乎是唯一应该显式地将指针投射到
void*
的地方

编辑

我刚看了那页。请注意,代码示例很旧(编写于1990年左右),到处都使用K&R风格(1989年以前的标准)函数定义语法和隐式
int
。它使用
%x
来显示指针值,因为直到1989年标准才将
%p
转换说明符添加到语言中

它不应该被用作现代C编程实践的模型


不过,他对指针的解释相当不错。

%x
希望其相应的参数具有类型
unsigned int
,这就是为什么会得到警告和时髦的输出。使用
%p
显示指针值:

T *p = some_pointer_value;
...
printf( "p = %p\n", (void *) p );
%p
要求其相应的参数具有类型
void*
。在C语言中,这几乎是唯一应该显式地将指针投射到
void*
的地方

编辑

我刚看了那页。请注意,代码示例很旧(编写于1990年左右),到处都使用K&R风格(1989年以前的标准)函数定义语法和隐式
int
。它使用
%x
来显示指针值,因为直到1989年标准才将
%p
转换说明符添加到语言中

它不应该被用作现代C编程实践的模型


不过,他对指针的解释相当不错。

如果使用积分格式(如%x或%u)操作指针,则会产生未定义的结果。%建议指针使用p。
就警告而言,%x需要一个无符号整数,并且您的变量的大小或对齐要求可能与无符号整数不同,因此您得到了警告。

如果使用整数格式(如%x或%u)操作指针,则会得到未定义的结果。%建议指针使用p。 就警告而言,%x需要一个无符号整数,并且您的变量的大小或对齐要求可能与无符号整数不同,因此您得到了警告。

值不能是“十六进制”。价值就是价值。同时,“十六进制”是一种表示人类消费价值的方式。“十六进制”是一种符号

但是,直接在指针上使用
%x
是非法的,因为
%x
格式说明符需要
无符号int
a