字符打印混乱
character printing confusion
我有一些代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
char abc [20] = "Hello Hello Hi";
char* ptr = abc;
cout << (abc+3);
return 0;
}
为什么从第三个字符开始打印,而不是第三个字符?
-edit- 给标记它的人。它与 prinf() 不同,但概念相同。我只是不知道其中的细微差别
char abc [20]
衰减为 char*
,这实际上是一个 C 风格的字符串。 abc+3
仍然是一个指针,只是从 abc[0]
偏移,所以 std::cout
仍然会把它打印成一个字符串。
要理解原因,您必须了解一点指针运算。
abc 与 &abc[0] 相同,(abc + 3) 与 &abc[3] 相同
也就是说,cout 将字符串从给定的 char * 打印到空字符。
因此,您基本上只是打印从第三个字符开始到字符串末尾的字符串。如果只想打印第三个字符,可以像这样取消引用指向第三个字符的指针。
*(abc + 3)
因为流有 char*
的重载,将输入视为 C 字符串。流运算符将打印所有内容,直到出现空终止符(当出现 char*
时)。
如果要打印单个字符,则必须将表达式转换为 char
而不是 char*
。
cout << (abc+3); // Type of expression is char*
cout << (*(abc+3)); // Type of expression is char
// This prints a signle character.
我有一些代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
char abc [20] = "Hello Hello Hi";
char* ptr = abc;
cout << (abc+3);
return 0;
}
为什么从第三个字符开始打印,而不是第三个字符?
-edit- 给标记它的人。它与 prinf() 不同,但概念相同。我只是不知道其中的细微差别
char abc [20]
衰减为 char*
,这实际上是一个 C 风格的字符串。 abc+3
仍然是一个指针,只是从 abc[0]
偏移,所以 std::cout
仍然会把它打印成一个字符串。
要理解原因,您必须了解一点指针运算。
abc 与 &abc[0] 相同,(abc + 3) 与 &abc[3] 相同
也就是说,cout 将字符串从给定的 char * 打印到空字符。
因此,您基本上只是打印从第三个字符开始到字符串末尾的字符串。如果只想打印第三个字符,可以像这样取消引用指向第三个字符的指针。
*(abc + 3)
因为流有 char*
的重载,将输入视为 C 字符串。流运算符将打印所有内容,直到出现空终止符(当出现 char*
时)。
如果要打印单个字符,则必须将表达式转换为 char
而不是 char*
。
cout << (abc+3); // Type of expression is char*
cout << (*(abc+3)); // Type of expression is char
// This prints a signle character.