printf 如何显示来自字符*的字符串

How does printf display a string from a char*?

本文关键字:字符 字符串 何显示 显示 printf      更新时间:2023-10-16

考虑一个简单的例子

Eg: const char* letter = "hi how r u";

字母是一个常量字符指针,指向字符串"嗨,你好吗"。现在,当我想打印数据或访问数据时,我应该使用*letter正确吗?

但是在这种情况下,我不应该只需要在调用 printf 时使用地址吗?

printf("%s",letter);

这是为什么呢?

*letter实际上是一个字符;它是letter指向的第一个字符。如果您正在操作整个字符串,那么按照惯例,函数将查看该字符,以及下一个字符,依此类推,直到它们看到零('\0')字节。

一般来说,如果你有一个指向一堆元素(即数组)的指针,那么指针指向第一个元素,并且不知何故,对这堆元素进行操作的任何代码都需要知道有多少个元素。对于char*,有零约定;对于其他类型的数组,通常必须将长度作为另一个参数传递。

仅仅因为 printf 有一个这样的签名: int printf(const char* format, ...);这意味着它期待指向字符表的指针,它将在内部取消引用。

字母不指向整个字符串,而是指向字符串的第一个字符,因此是字符指针。

当您取消引用指针(带 * )时,您指的是字符串的第一个字符。

但是,单个字符对 prinf 非常有用(当打印字符串时),因此它取而代之的是指向第一个元素的指针并递增其值,打印出取消引用值,直到找到空字符"\0"。

由于这是一个C++问题,因此同样重要的是要注意,您应该真正将字符串存储为安全封装类型std::string,并在可能的情况下存储为安全 iostreams 类型:

std::string line="hi how r u";
std::cout << line << std::endl;

%s打印到第一个请参阅:http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx,%s是一个字符串格式字段,这里没有什么奇怪的事情。

printf("%s")期望地址通过内存搜索NULL)=字符串的结尾。在这种情况下,您只说letter.printf("%c")期望值而不是地址:printf("%c", *letter);

printf将指向数据数组的指针作为参数。因此,如果您要显示带有 %s 的字符串(一种数组)或带有 %d%e%f 等的数字,请始终传递不带 * 的变量名。变量名指向数组第一个元素的指针,printf将根据类型(char是 1 或 2 个字节,int s 是 4 等)使用简单的指针算法打印数组的每个元素,直到达到 EOL 或零值。

当然,如果您创建指向数组变量的指针,则需要使用 * 取消引用该指针。但这与其说是规则,不如说是例外。:)