C ++ char单引号vs双引号&记忆内部运作

时间:2012-08-18 03:27:47

标签: c++ iostream cout memory-address

我想知道程序在运行时在内存方面的作用,因为它遇到以下情况:

char chr = 'a';
char chrS[] = "a";
cout << "Address: " << &chr << endl;
cout << "Address: " << &chrS << endl;

这会产生以下结果:

Address: a�c�3�
Address: 0x7fff33936280

为什么我不能获得“chr”的内存地址?

2 个答案:

答案 0 :(得分:12)

因为&chr产生char*(这里隐式添加const)而cout假定它是一个字符串,因此无效终止,而不是。< / p>

但是,&chrS会产生一个char(*)[],它不会衰减到const char*,因此会通过operator<<(std::ostream&, const void*)重载输出,从而输出地址。

如果您想要const char*的此行为,则必须执行显式转换。 C字符串和指向单个字符的指针之间没有区别这一事实是C字符串的主要缺陷之一。

答案 1 :(得分:0)

尝试

cout << "Address: " << hex << (long)(&chr) << endl;

否则,当它获取指向char的指针时,它会认为你给它一个字符串并尝试将其打印为一个字符串。