【问题标题】:Hexadecimal doubts and C + + [closed]十六进制疑问和 C++ [关闭]
【发布时间】:2013-08-21 22:32:21
【问题描述】:

我的问题是:为什么有一个“--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 ;

}

【问题讨论】:

  • 这是作为 IOCCC 参赛者参赛的吗? [不应该是 13,并且在*p = 0x0; p++; 行之前有一个*p=0x0a; p++; 吗?

标签: c++ pointers hex


【解决方案1】:
char *p = _ _ _ _ _ _ _ _ _ _ _ _
         /\

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

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

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

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

所以这会将指针 back 移动到 left 一个位置。

【讨论】:

    【解决方案2】:

    我更愿意这样做:

    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]

    【讨论】:

      【解决方案3】:

      这些是为了让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;
      }
      

      【讨论】:

      • 请使用括号。 *p++ 对于可以将其解释为 *(p++)(*p)++ 的读者来说是模棱两可的
      • @UmNyobe:如果读者无法弄清楚表达的含义,他们应该查看优先规则,而不是要求作者用不必要的括号来溺爱它们。 *p++ = x; 是每个 C 教程早期都涵盖的常见且历史悠久的习语。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2018-01-05
      • 2020-03-22
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多