我不确定是否存在类似的问题,但是
char *ptr = "xyz";
printf("%p\n", ptr);
打印地址,但是 (请注意格式说明符)
char *ptr = "xyz";
printf("%s\n", ptr);
打印字符串?
到目前为止,我了解到的是,打印ptr
将给出地址,而打印*ptr
将给出值。
我很困惑。
答案 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"
,使用指针本身的值。