指向字符数组的字符指针与单个字符有何不同?

4
当我使用字符指针指向单个字符时,它似乎最终指向了一个字符数组。这里出了什么问题?
 #include <iostream>
 #include <map>

 using namespace std;

 int main() {

     char first = 'a';
     char second = 'b';
     char third = 'c';

     map<char, char *> myMap;

     myMap['a'] = &first;
     myMap['b'] = &second;
     myMap['c'] = &third;

     cout << myMap['a'] << endl; // ends up printing 'abc' or 'cba'

     system("pause");
     return 0;    
 }

4
如果不进行这个操作,std::cout << "Hello, world!\n"; 将输出 H,对于初学者来说会非常困惑。 - chris
2
如果你将一个 char * 传递给一个 iostream,它会认为它是一个 C 风格的字符串。 - Oliver Charlesworth
1
@chris 实际上,它会打印类似于“0x4f72b6d4”的东西 - 然后它不需要解引用指针的单一原因。 - Angew is no longer proud of SO
@Angew,我刚在想那个>.> 呃,算了,我就让全世界看到我的未经思考的评论吧。 - chris
@chris 那个来回讨论实际上很清晰地阐明了正在发生的事情 = ) - jonathanpaul
1个回答

7

operator<< 重载 char* 类型,需要一个以空值结尾的字符数组指针,以便知道字符串在哪里结束。恰好你的char变量在内存中是连续分配的,并且后面跟着一个 0 字节。但这段代码会产生未定义的行为。

要打印单个字符,请解引用指针:

cout << *myMap['a'] << endl;

谢谢你挽救了我的理智。 - jonathanpaul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接