2010-07-30 66 views
2

承担使用指针与char变量

char a='s'; 

现在我想变量a的地址存储在字符指针p

char *p=&a; 

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

任何人都可以解释为什么是这样吗?

回答

8

basic_ostream<<运算符是专门为const char*参数*输出它像一个C字符串**。有关更多详细信息,请参阅the answer to Why does cout print char arrays differently from other arrays?

基本上,打印时可以将p转换为void*以获取地址。

cout << static_cast<void*>(p); 

*:也const charT*其中charT是由basic_ostream,和const unsigned char*const signed char*如果charT == char采用的字符类型。例如,wcout会将const wchar_t*视为(宽)C字符串,但cout会将其视为指针。

**:这可以通过basic_ostream使用的字符特征进行过滤。有关详细算法,请参见C++标准§ [ostream.inserters.character]/4。

+4

肯尼没有给他的第一句话解释? – codymanix 2010-07-30 11:31:57

+1

@codymanix现在有一个链接,当我投票没有。链接是完美的,但他写的是垃圾。 'char *'不是专门用于字符串,什么都不做。他写道,它输出的东西是绝对错误的。对于char *,我可以保存每个我想要的字节数组。这个问题的正确答案是运营商。这就是原因。现在我只是在大笑,这个无意义的答案能够获得高评价 – Gaim 2010-07-30 11:36:05

+0

@gaim不,它不是垃圾,它只是以一种令人困惑的方式编写的,但是char *的<<运算符专门用来将它视为一个以null结尾的字符串。真的,为此降低投票有点荒谬,只是在评论中注意到他的句子构造有点混乱。 – KillianDS 2010-07-30 11:39:33

-1

在C/C++中,指向char的指针通常用作指向以空字符结尾的字符串的指针。运算符处理这个常见用例。

1

调用cout << p是类型安全的(C++对象和运算符),因此它使用char *运算符。这个操作符用于打印保存在字符指针中的字符串。它接收地址并打印从开始到第一次出现字节零的所有内容。如果您使用的是MS窗口,那么它可能只是这一个字符,因为这个系统会将内存零化,所以很快就会有零字节。如果要打印地址,请尝试cout << (void *)p;

+0

谢谢你们,我明白了! – 2010-07-30 13:28:33

+0

不要强制转换为int来打印出'char *'的实际指针值,因为这可能导致在64位应用程序中截断输出。将其转换为'void *'代替。 – 2010-07-30 13:43:21

+0

@Mark好的,谢谢 – Gaim 2010-07-30 13:54:32

0

在C a char*中通常用于指向(以空字符结尾的)字符串的开头。为了使C++ IO流(如cout)与此习惯兼容,有一个operator<<()超负荷版本用于处理char指针。该运算符仅打印出从给定地址开始的以空字符结尾的字符串。

如果你想打印出指针的“价值”(请注意,它不是一部分的C/C++标准是什么一个指针很像'),转换指针到void*

std::cout << static_cast<void*>(charpointer); 
+0

谢谢你总结我们写的东西。 – Gaim 2010-07-30 12:16:51

0

以上许多答案告诉你,< <运算符被重载以处理char *作为C类型的字符串,即以NULL结尾的字符数组。在你打印p的情况下,它被视为C字符串,并且所有字符被打印,直到第一个NULL字符被打印。如果您仅获得s,则会在内存中紧邻您的变量a旁边有一个NULL字符。但是,这种行为可能会根据内存内容而改变。我猜你正在声明一个全局变量,因为全局变量的空间通常被初始化为全零。

另外,这将是一个有趣的实验,你要声明两个字符变量,然后cout那里的指针与上面一样。我的猜测是指向第一个变量的指针将会打印它们两个。