使用带有char变量的指针

时间:2010-07-30 11:12:56

标签: c++ pointers

假设

char a='s';

现在我想将变量a的地址存储在char指针p

char *p=&a;

如果我使用cout << p;,那么我得到的值是s,而不是地址!

任何人都能解释其原因吗?

5 个答案:

答案 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_ostreamconst 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;操作员处理这个常见的用例。