繁体   English   中英

char * ptr上的printf%s是否尊重它?

[英]Does printf %s on char *ptr deference it?

我不确定是否存在类似的问题,但是

char *ptr = "xyz";
printf("%p\n", ptr);

打印地址,但(请注意格式说明符)

char *ptr = "xyz";
printf("%s\n", ptr);

打印字符串?

到目前为止,我了解到的是,打印ptr将给出地址,而打印*ptr将给出值。 我很困惑

首先,检查格式说明符。

对于fsff( fprintf()系列的%s ,来自C11 ,第§7.21.6.1章( 重点是我的

s

如果没有l长度修饰符,则参数应为指向字符类型数组的初始元素的指针。 280) 将数组中的字符写到(但不包括)终止空字符。 [...]

并且,对于%p

p

该论点应为指向void的指针。 指针的值以实现定义的方式转换为一系列打印字符。

因此,基本上,是的,当您尝试打印内容时,必须(无论如何)取消引用指针。

在C中用%s打印时。根据C中字符串的定义,您要打印一个字符数组,直到第一个'\\ 0'。因此,实际上您使用第一个字符的地址,并且printf会尊重它远。

这意味着

char *ptr = "xyz";
printf("%s\n", ptr);

从ptr的地址开始打印,直到ptr的第一个单元格,其中ptr[x] == '\\0'

当使用"%s" printf实际上将在字符串上循环以逐个字符地打印它,直到找到字符串的空终止符为止。

为此,它需要使用数组索引,这实际上取消了指针的引用。

如果指针指向,则printf使用"%s"使用该值。 "%p"指针本身的值被使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM