我有一小段代码可以做一些有趣的事情,但我无法弄清楚它是如何做到的。
int main(int argc, const char * argv[])
{
char text[] = "object";
for(char *ptr = &text[0]; *ptr != '\0'; ptr+=2)
{
cout << ptr << endl;
ptr--;
}
return 0;
}
发生的事情是它从[1],[2],[3]等等到每次字符串的结尾,打印出内容。我无法理解它是如何做到的,因为指针永远不会被解除引用,但正确的字母似乎被打印出来。我会假设,而不是字符串的字母,指针值将打印为奇怪的字符,但是,这不是发生的事情。
答案 0 :(得分:3)
这是未定义的行为。第一次迭代ptr
指向"object"
。一切都好,打印出来,然后你做ptr--
。所以现在,ptr
指向你不再拥有的记忆。只要你没有取消引用它或在它上面做指针算术,它就没问题。但是当你在循环中递增它时,你会这样做 - ptr+=2
。
在第一次迭代中,ptr
指向"object"
,因此它打印出来。 cout::operator << (const char*)
打印以null结尾的字符串。否char
需要解除引用。
在第二次迭代中,ptr
递减,然后增加2
,指向"bject"
。等等...
答案 1 :(得分:2)
你是对的,通常会打印地址。除了char *
有一个特殊的重载,它将它视为一个C字符串并输出所有字符,从ptr
开始,直到它找到零(\0
)。
...或者如果你的代码是正确的话会发生这种情况,因为现在它通过在第一次迭代时递减ptr
来调用UB(ptr
超出范围)并且然后在它之后将它递增2。
如果要显示指针的地址,请将其强制转换为void *
:
cout << static_cast<void *>(ptr) << endl;
答案 2 :(得分:2)
这里没什么好看的。有ostream::operator<<(const char *p)
打印字符串。指针沿着字符串走,程序从各个位置开始打印。唯一奇怪的是疯狂的+ 2,-1指针递增。