【问题标题】:What is the behavior of the plus plus (++) operator when applied to a struct?加号 (++) 运算符应用于结构时的行为是什么?
【发布时间】:2012-08-26 03:49:51
【问题描述】:

我正在尝试通过玩 Arduino Uno 来学习 C。我正在审查code for the Colorduino library on github。我想知道++ 在应用于结构时如何工作。

Colorduino.h 中定义了一个PixelRGB 结构:

typedef struct pixelRGB {
  unsigned char r;
  unsigned char g;
  unsigned char b;
} PixelRGB;

Colorduino.cpp 中有一段代码将++ 运算符应用于PixelRGB 指针。这是如何工作的?

for (unsigned char y=0;y<ColorduinoScreenWidth;y++) {
  for(unsigned char x=0;x<ColorduinoScreenHeight;x++) {
    p->r = R;
    p->g = G;
    p->b = B;
    p++;
  }
}

【问题讨论】:

  • 我不太了解 c 或 arduino,所以我不会将此作为答案发布,但也许它会增加所有公共字段?
  • 在这种情况下,您正在递增指向结构的指针 p 所以现在 p 将指向下一个 PixelRGB
  • 这不就是指针运算吗?
  • @nhahtdh... 可能是我需要查找并再次阅读的内容。
  • @Tanmoy,我想你可能是对的

标签: c struct arduino


【解决方案1】:

请注意,此代码将 pointer 增加到 PixelRGB,而不是结构本身。 因此,++ 的结果在应用于指针时,只是将其值增加了sizeof(PixelRGB)

【讨论】:

    【解决方案2】:

    p 是一个指针,而不是一个结构体,所以它的工作原理就像指针运算在任何类型上所做的那样。指针的值是一个地址。因此,例如,当您将n 添加到指针时,它的值会发生变化并指向一个新地址n * sizeof type。所以...

    char *p = malloc(SOME_NUMBER * sizeof char);
    p++;     // p = p + sizeof char
    p += 4;  // p = p + sizeof char * 4
    

    如果你有一个结构......

    typedef struct {
        int a;
    } foo;
    
    /* ... */
    
    foo *fp = malloc(SOME_NUMBER * sizeof foo);
    fp++;    // fp = fp + sizeof foo;
    fp += 4; // fp = fp + sizeof foo * 4;
    

    【讨论】:

    • 请注意,p 以空指针开头,对其执行算术运算具有未定义的行为。
    • @KeithThompson:是的,我想到了这一点,但我认为这无关紧要。由于这是一个初学者......改变它可能是一个好主意。
    • 请注意* sizeof char 是多余的,因为sizeof char 定义为1。
    • @KeithThompson:我知道sizeof char 保证为1,但为了便于说明,我认为最好包含它。
    • 您的 cmets 有点误导。从技术上讲,p + (4 * sizeof char) 将指针值增加到(4 * sizeof char) * (sizeof char)。也许只是一些英语单词?或者可能转换为一些无符号整数类型?
    猜你喜欢
    • 2011-06-08
    • 2012-05-07
    • 1970-01-01
    • 2014-02-16
    • 2014-03-04
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多