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

时间:2018-07-16 13:39:56

标签: c printf

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

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

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

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

打印字符串?

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

3 个答案:

答案 0 :(得分:2)

首先,检查格式说明符。

对于%s族的fprintf(),来自C11,第§7.21.6.1章(强调我的

  

s

     

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

,对于%p

  

p

     

自变量应为指向void的指针。指针的值是   在实现定义中转换为打印字符序列   方式。

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

答案 1 :(得分:0)

当在C中使用%s打印时。根据C中字符串的定义,您要打印一个字符数组,直到第一个'\ 0'。因此,实际上您使用第一个字符的地址和printf会顺其自然。

这意味着

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

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

答案 2 :(得分:0)

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

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

使用"%s",然后printf使用该指针所指向的值。对于"%p",使用指针本身的值。