printf 如何显示来自字符*的字符串
How does printf display a string from a char*?
考虑一个简单的例子
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
打印到第一个