考虑一个简单的例子
Eg: const char* letter = "hi how r u";
letter是一个const字符指针,指向字符串“hi how r u”。现在,当我想打印数据或访问数据时,我应该使用*letter
正确吗?
但是在这种情况下,我不应该只在调用printf时使用地址吗?
printf("%s",letter);
那为什么会这样?
答案 0 :(得分:7)
*letter
实际上是一个角色;它是letter
指向的第一个字符。如果您正在操作一整串字符,那么按惯例,函数将查看该字符,然后查看下一个字符,直到它们看到零('\ 0')字节。
通常,如果你有指向一堆元素(即数组)的指针,那么指针指向第一个元素,并且以某种方式操作在这一组元素上的任何代码需要知道有多少元素。对于char*
,有零惯例;对于其他类型的数组,您通常必须将长度作为另一个参数传递。
答案 1 :(得分:1)
因为printf有这样的签名:int printf(const char* format, ...);
这意味着它期望指向char表的指针,它将在内部取消引用。
答案 2 :(得分:1)
字母不是指向整个字符串,而是指向字符串的第一个字符,因此是一个字符指针。
当您取消引用指针(使用*
)时,您指的是字符串的第一个字符。
然而,单个字符对prinf(打印字符串时)很有用,所以它将指针指向第一个元素并递增它的值,打印出取消引用值,直到找到空字符'\ 0'。
由于这是一个C ++问题,因此请务必注意,您应该将字符串存储为安全封装类型std::string
,并尽可能保存类型安全的iostream:
std::string line="hi how r u";
std::cout << line << std::endl;
答案 3 :(得分:1)
%s
打印到第一个\0
,请参阅:http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx,%s
是一个字符串格式字段,此处没有任何奇怪的内容。
答案 4 :(得分:1)
printf("%s")
期望地址通过内存搜索NULL
(\0
)=字符串结尾。在这种情况下,您只说letter
。要printf("%c")
预期值不是地址:printf("%c", *letter);
答案 5 :(得分:1)
printf
将指向数据数组的指针作为参数。因此,如果您要显示包含%s
的字符串(一种数组)或包含%d
,%e
,%f
等的数字,请始终传递变量名称没有*
。变量名是指向数组第一个元素的指针,printf
将根据类型使用简单的指针算法打印数组的每个元素(char
是1或2个字节,int
s为4,等等),直到达到EOL或零值。
当然,如果你将指针指向数组变量,那么你想要用*
取消引用该指针。但这比规则更为例外。 :)