2014-10-26 94 views
4

我在理解指针时遇到了一些麻烦。在下面的代码,我想打印一个变量的地址在2种方式,一旦使用地址运算符,然后使用指针:在C++中使用指针的变量值和地址

#include<iostream> 
using namespace std; 
int main (void) 
{ 
    int x = 10; 
    int *int_pointer; 
    int_pointer = &x; 
    cout << "x address=" << &x << endl; 
    cout << "x address w pointer=" << int_pointer << endl; 
    return 0; 
} 
x address = 0028FCC4 
x address w pointer = 0028FCC4 

可正常工作。但是,当我做同样的事情,但现在使用字符类型的变量,我得到一些垃圾输出:

#include<iostream> 
using namespace std; 
int main(void) 
{ 
    char c = 'Q'; 
    char *char_pointer; 
    char_pointer = &c; 
    cout << "address using address operator=" << &c << endl; 
    cout << "address pointed by pointer=" << char_pointer << endl; 
    return 0; 
} 
address using address operator=Q╠╠╠╠£åbªp é 
address pointed by pointer=Q╠╠╠╠£åbªp é 

我不知道为什么会这样。提前致谢。

回答

7

C++库为某些类型重载运算符< <。 (char *)就是其中之一。 Cout试图打印一个字符串,一个由空字符结尾的字符数组。

只投的指针:

cout << "address pointed by pointer" << (void*)char_pointer << endl; 

cout << "address pointed by pointer" << static_cast<void*>(char_pointer) << endl; 
+0

这是正确的,但我补充说明一下。 C++库为某些类型重载<<运算符。 (char *)就是其中之一。 C/C++的一个坏处是它们将指针/数组和数组或char/string作为同义词处理。 <<操作符(char *)版本是您试图打印字符串的东西,而不是指针值。当你打印指针时,最好的方法是将它们转换为void:reinterpret_cast (point)。 – user3344003 2014-10-27 00:43:59

+0

@ user3344003如果您有更正或改进它的合理建议,请随时编辑我的答案,或者添加答案,而不是使用评论。 – 2501 2014-10-27 00:45:51

+0

会做。当这是正确的时候,我不想添加另一个答案。 – user3344003 2014-10-27 00:47:11

0

它打印出一些假的东西的原因是因为你的字符没有一个空终止,这意味着该计划将继续寻找一个直到,并在这个过程中将打印出它找到的任何东西。您看到的文本是ASCII,但是由ostream错误解释的地址引用。要获取内存中的地址,可以使用隐式转换或static_cast。我更喜欢后者:

cout << "address pointed by pointer=" << static_Cast<void*>(char_pointer) << endl; 
1

像2501说,在不同的措词,&c,因为c是char,等于char *,所以它要尝试打印,直到换行字符'\0'是或隐明确地将字符数组放到std::cout,以便流知道字符数组的末尾在哪里。

所以,是使用(void *)就像2501所说。