English 中文(简体)
C++ 用于环形/字符指针“ Hack”
原标题:C++ for loop/char pointer "hack"
  • 时间:2012-05-24 19:57:35
  •  标签:
  • c++

我有一个小的代码 做一些有趣的事, 但我不知道它是如何做到的。

int main(int argc, const char * argv[])
{
    char text[] = "object";
    for(char *ptr = &text[0]; *ptr !=   ; ptr+=2) 
    {   
        cout << ptr << endl;
        ptr--;
    }
    return 0;
}

所发生的事情是,它从[1]、[2]、[3]等等,一直到字符串的尽头,每次打印内容。我不明白它是如何做到的,因为指针从未被贬低过,但正确的字母似乎正在被打印。我假设,指针的值将不是字符串的字母,而是作为怪异的字符打印,但是,这并没有发生。

最佳回答

这是 < 坚固 > 无法定义的行为 < / 坚固 > 。 第一次迭代, < code> pptr 指向 < code> "object" . all good, 打印出来, 但随后你又做了 ptr- 。 因此, 现在, pptr 指向不再拥有的记忆。 只要您不参考它或对它做指针算, 就会确定。 但是, 当您在循环中加插它时, 您会这样做 - < codecol> pptr _2

Why it s behaving like this:

在第一个迭代时, ptr 指向 "object" ,因此它可以打印。 cout::: operator << & lt; (Const char*) 指向一个无效终止的字符串。 No char 需要删除引用 。

在第二个迭代上, ptr 被减少,然后由 2 增加,指向 "bject" 。等等。

问题回答

这里没有什么真正的黑客。 有一个 < code> ostream:: operator< & lt; (const char *p) 打印字符串。 指针沿着字符串行走, 程序从不同位置开始打印。 唯一奇怪的是疯狂的 +2, - 1 指针递增 。

您是对的, 通常会打印地址 。 除非 chare {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}有特殊超载, 它把它视为C字符串, 并输出出所有字符, 从>ptr<{{{{{{{{{{{{{{{{{{{{{{}}}开始, 直到它发现一个零(

...或者如果你的代码正确的话,就会发生这样的情况,因为现在它通过在第一次迭代(ptr move out of range)上减少 来援引UBU, 然后再加注2。


如果您想要显示指针的 address , 请投到 eve {{{{{{{/code>:}:

cout << static_cast<void *>(ptr) << endl;




相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?