C ++ for loop / char指针“hack”

时间:2012-05-24 19:57:35

标签: c++

我有一小段代码可以做一些有趣的事情,但我无法弄清楚它是如何做到的。

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]等等到每次字符串的结尾,打印出内容。我无法理解它是如何做到的,因为指针永远不会被解除引用,但正确的字母似乎被打印出来。我会假设,而不是字符串的字母,指针值将打印为奇怪的字符,但是,这不是发生的事情。

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指针递增。