十六进制疑问和C ++

时间:2013-08-20 01:11:17

标签: c++ pointers hex

我的问题是:为什么会出现“ - p”,据我所知,“++ p”函数用于攀爬一些虚构的数组指针,但“ - p”是为了什么?我意识到没有它,代码字母不会显示,但不明白这是如何工作的。谢谢,甚至更多

代码:

#include <stdio.h>

using namespace std;

int main()
{
    char* p = new char [12];
    *p=0x48;
    ++p;
    *p=0x65;
    ++p;
    *p=0x6c;
    ++p;
    *p=0x6c;
    ++p;
    *p=0x6f;
    ++p;
    *p=0x20;
    ++p;
    *p=0x57;
    ++p;
    *p=0x6f;
    ++p;
    *p=0x72;
    ++p;
    *p=0x6c;
    ++p;
    *p=0x64;
    ++p;
    *p=0x0;
    ++p;

    --p;
    --p;
    --p;
    --p;
    --p;
    --p;
    --p;
    --p;
    --p;
    --p;
    --p;
    --p;

    printf(p);
    delete p;

    return 0 ;

}

3 个答案:

答案 0 :(得分:1)

char *p = _ _ _ _ _ _ _ _ _ _ _ _
         /\

最初p指向数组的开头,如图所示

p++ == ++p == (p = p+1) 

所以这会将指针向前移动一个位置移到右侧

p-- == --p == (p = p-1) 

所以这会将指针移回一个位置到 left

答案 1 :(得分:0)

那些使p指向刚刚写入的字符串的开头。

有几种方法可以改善这一切,例如:

p -= 12;  // instead of all the --p

strcpy (p, "\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64");

p = new string ("\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64");

甚至:

*p++ =0x48;
*p++ =0x65;
*p++ =0x6c;
*p++ =0x6c;
*p++ =0x6f;
*p++ =0x20;
*p++ =0x57;
*p++ =0x6f;
*p++ =0x72;
*p++ =0x6c;
*p++ =0x64;
*p    =0x0;

p -= 11;

或者,直接直观:

int main ()
{
     printf ("Hello World");
     return 0;
}

答案 2 :(得分:0)

我非常希望这样做:

char *p = new char[13];
char *q = p; 
*p=0x48;
++p;
*p=0x65;
++p;
*p=0x6c;
++p;
*p=0x6c;
++p;
*p=0x6f;
++p;
*p=0x20;
++p;
*p=0x57;
++p;
*p=0x6f;
++p;
*p=0x72;
++p;
*p=0x6c;
++p;
*p=0x64;
++p;
*p=0x0;
++p;

printf(q);

但实质是因为它需要移动--p以“反向回到开头”,作为设置字符串的++ p的计数器。

[没有运行它,我可以看到它打印Hello World]