打印字符指针与通过取消引用打印字符 这是用C++语言编写的代码。 为什么在第一个COUT语句中,程序试图打印直到找到空字符,而在第二个语句中,它只打印一个字符?

打印字符指针与通过取消引用打印字符 这是用C++语言编写的代码。 为什么在第一个COUT语句中,程序试图打印直到找到空字符,而在第二个语句中,它只打印一个字符?,c++,C++,它是C和C++的特定内容。字符指针是指在结尾有零符号的字符串。 < P>这是C和C++的特定内容。Car的指针是指在结尾有零符号的字符串。C++中的< P>,指向字符的指针通常被认为是C字符串,这是字符的空结尾字符串。在C++的标准库中,这是一个预期的约定——这在STD::oSoo流传中也是成立的。 特别是在您的两次通话中: 指针p将调用std::ostream的重载-它将其打印为以null结尾的字符串,然后 char*p将调用std::ostream的字符重载,它将打印单数字符 注意:如果要打

它是C和C++的特定内容。字符指针是指在结尾有零符号的字符串。

< P>这是C和C++的特定内容。Car的指针是指在结尾有零符号的字符串。C++中的

< P>,指向字符的指针通常被认为是C字符串,这是字符的空结尾字符串。在C++的标准库中,这是一个预期的约定——这在STD::oSoo流传中也是成立的。 特别是在您的两次通话中:

指针p将调用std::ostream的重载-它将其打印为以null结尾的字符串,然后 char*p将调用std::ostream的字符重载,它将打印单数字符 注意:如果要打印指针本身的地址,则需要调用重载-这需要显式转换为void*:

STD:C++中的CUT

,指向字符的指针通常被认为是C字符串,这是字符的空结尾字符串。在C++的标准库中,这是一个预期的约定——这在STD::oSoo流传中也是成立的。 特别是在您的两次通话中:

指针p将调用std::ostream的重载-它将其打印为以null结尾的字符串,然后 char*p将调用std::ostream的字符重载,它将打印单数字符 注意:如果要打印指针本身的地址,则需要调用重载-这需要显式转换为void*:


但p不是常量字符*,它是字符*,那么为什么重载更好呢?我猜它没有任何重载可以接受指向非常量的指针,并且const void*成员与const char*free函数的匹配度不如const char*free函数?函数参数中的@NathanPierson const声明只涉及函数本身,即函数不能修改此指针的内容,但这并不意味着你不能传递非常量指针。@NathanPierson简短/简化的回答:在重载解析过程中,如果在本例中没有发现完全匹配的char*,编译器可以选择一个重载,如果它在指针/引用参数的CV限定符方面受到更多的约束-在本例中选择了const char*。但是p不是const char*,而是char*,那么为什么重载更好呢?我猜它没有任何重载可以接受指向非常量的指针,并且const void*成员与const char*free函数的匹配度不如const char*free函数?函数参数中的@NathanPierson const声明只涉及函数本身,即函数不能修改此指针的内容,但这并不意味着你不能传递非常量指针。@NathanPierson简短/简化的回答:在重载解析过程中,如果在本例中没有发现完全匹配的char*,如果编译器在指针/引用参数的CV限定符方面受到更多约束,则可以选择重载—在本例中,选择了const char*。这两个语句都是false。char的pointer表示末尾带有零符号的字符串—这最多是一个常见约定—但这并不是普遍正确的。从根本上说,指向字符的指针只是指向0个或更多字符的字符序列的指针,但是语言中没有任何东西期望它以null结尾;这只是惯例。在很多情况下,字符指针不会以null结尾,例如对于堆栈缓冲区、std::string_视图或任何等效语句等。这两个语句都是错误的。字符指针表示末尾带有零符号的字符串-这最多是一个常见的约定-但这并不是普遍正确的。从根本上说,指向字符的指针只是指向0个或更多字符的字符序列的指针,但是语言中没有任何东西期望它以null结尾;这只是惯例。在很多情况下,字符指针不会以null结尾,例如对于堆栈缓冲区、std::string_视图或任何等效对象等。
char c = 'a';

char* p = &c;

cout << p << endl;

cout << *p << endl;