假设
char a='s';
现在我想将变量a的地址存储在char指针p
中char *p=&a;
如果我使用cout << p;
,那么我得到的值是s,而不是地址!
任何人都能解释其原因吗?
答案 0 :(得分:8)
basic_ostream
的{{1}}运算符专门用于<<
参数*,将其输出为C字符串**。有关详细信息,请参阅the answer to Why does cout print char arrays differently from other arrays?。
基本上,您可以在打印时将const char*
投射到p
以获取地址。
void*
*:cout << static_cast<void*>(p);
其中const charT*
是charT
采用的字符类型,basic_ostream
和const unsigned char*
const signed char*
}}。例如,charT == char
会将wcout
视为(宽)C字符串,但const wchar_t*
会将其视为指针。
**:cout
使用的角色特征可能会过度。有关详细算法,请参阅C ++标准§[ostream.inserters.character] / 4.
答案 1 :(得分:1)
调用cout << p
是类型安全的(C ++对象和运算符),因此它使用char *运算符。此运算符用于打印保存在char指针中的字符串。它接收地址并打印从开始到第一次出现的字节零的所有内容。如果您正在使用MS窗口,那么可能只有这一个char,因为该系统将内存归零,因此很快就会出现零字节。如果您要打印地址,请尝试cout << (void *)p;
答案 2 :(得分:0)
在C中,char*
通常用于指向(以null结尾的)字符串的开头。为了使C ++ IO流(例如cout
)与此习惯兼容,有operator<<()
的重载版本用于处理char
指针。此运算符只打印从给定地址开始的以null结尾的字符串。
如果要打印指针的'value'(注意它不是C / C ++标准的一部分,指针'看起来像'),将指针强制转换为void*
,如< / p>
std::cout << static_cast<void*>(charpointer);
答案 3 :(得分:0)
上面的许多答案告诉你,&lt;&lt;运算符被重载以处理char *作为C类型字符串,即NULL终止字符数组。在您打印p的情况下,它将被视为C字符串,并且将打印所有字符,直到第一个NULL字符为止。如果您只打印 s ,则内存中的变量 a 旁边会有一个空字符。但是这种行为可能会根据内存内容而改变。我猜你要声明一个全局变量,因为全局变量的空间通常被初始化为全零。
对于你来说,声明两个字符变量,然后以与上面相同的方式cout指针,这将是一个有趣的实验。我的猜测是指向第一个变量的指针将打印出它们。
答案 4 :(得分:-1)
在C / C ++中,指向char的指针通常用作指向以null结尾的字符串的指针。 &lt;&lt;&lt;操作员处理这个常见的用例。