问题描述
char * ptr =“ helloworld”; printf(ptr);
为什么要打印helloworld,因为我没有在printf中使用* ptr,它应该提供类似于我们用于整数指针的值。
根据我的说法,我们应该在printf中使用printf(* ptr)
解决方法
对于任何指针或数组p
和索引i
,表达式p[i]
等于*(p + i)
。
如果索引i
为零,则我们有p[0]
等于*(p + 0)
。将零加到任何操作都是空操作,因此为*(p)
。并且这里不需要括号,这给了我们*p
。
因此,在您的情况下,*ptr
与ptr[0]
相同,后者是字符串中的第一个字符。并且仅字符串中的第一个字符,类型为char
。
“字符串”是以空字符结尾的序列字符,要使用它,我们对第一个字符使用 pointer 。这就是普通的ptr
(不取消引用)。并且与printf
格式的字符串参数匹配,该参数必须是指向以空字符结尾的字符串中第一个字符的 pointer 。
printf
期望其第一个参数是指向char
的指针:
7.21.6.3C 2011 Online Draftprintf
函数
简介
1#include <stdio.h>
int printf(const char * restrict format,...);
如此
printf( ptr );
是正确的 1 。但是,打印纯文本字符串的通常做法是执行类似的操作
printf( "%s\n",ptr );
而不是将其作为格式字符串作为传递。或者,您可以使用puts
函数:
puts( ptr );
因为不涉及格式化。
ptr
中的值是字符串的第一个字符的地址-printf
将打印从该地址开始的字符的序列,直到看到字符串终止符 2 。
- 您可以将
char *
参数传递给需要const char *
的函数,但不能相反。您将获得“参数n丢弃const
”之类的诊断信息。函数声明中的restrict
关键字基本上是优化提示-您现在不必担心这一点。 - 如果在格式字符串如
%d
或%f
中看到转换说明符,它将采用相应参数的值并将其格式设置为等价的字符序列。