C ++指针与数组和指针转换

时间:2012-10-04 18:49:11

标签: c++ arrays pointers casting

我正在尝试以下代码:

unsigned long * foo = (unsigned long *) 0x200000;

所以,据我所知,foo指向无符号长0x200000。现在,如果我尝试,

std::cout<<foo[0];

我认为这应该打印值0x200000(可能是十进制)。因为,foo[0] = *(foo + 0) = 0x200000。 但是,它实际上会打印0

我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

你误解了,

unsigned long * foo = (unsigned long *) 0x200000;

将0x200000解释为unsigned long的地址。由于您在程序中可以合法访问unsigned long的地址极不可能,

std::cout<<foo[0];

几乎肯定是未定义的行为,可能会导致段错误。但是,在您的情况下,访问该内存位置不会导致段错误,并且那些位被解释并打印为unsigned long,它们恰好都是0。

答案 1 :(得分:0)

type * pointerName = addressItPointsTo;

pointerName[0]*pointerName相同,意味着取消引用指针并获取其指向的地址的值。它恰好是0,但它通常会导致分段错误。