难以理解C指针语法

时间:2011-05-11 15:39:49

标签: c pointers

给出以下C定义:

#define SYNC_BYTE_1                         0x5A
#define SYNC_BYTE_2                         0xA5

和指针声明:

UINT8   *pCommandData;
pCommandData = GetCommandBufferPointer( LINGO_GENERAL, stringLength + 3 );

以下两行代码到底是做什么的?

*pCommandData++ = SYNC_BYTE_1;
*pCommandData++ = SYNC_BYTE_2;

我特别不理解在此实例中使用*++。如果指针的地址递增,*是否应该用&替换?

9 个答案:

答案 0 :(得分:8)

pCommandData是指向某段内存的指针。第一行

*pCommandData++ = SYNC_BYTE_1;

将该地址的值设置为0x5A,然后将指针pCommandData递增到下一个地址。下一行

*pCommandData++ = SYNC_BYTE_2;

的工作方式类似:它将pCommandData指向的值设置为0xA5,然后将指针递增到下一个地址。

也许一张照片会很有用。在任一行执行之前,pCommandData所指向的邻域中的内存可能如下所示:

                    |        |
                    +--------+
pCommandData -----> |        |
                    +--------+
                    |        |
                    +--------+
                    |        |
                    +--------+
                    |        |

*pCommandData++ = SYNC_BYTE_1;之后:

                    |        |
                    +--------+
pCommandData --+    |  0x5A  |
               |    +--------+
               +--> |        |
                    +--------+
                    |        |
                    +--------+
                    |        |

*pCommandData++ = SYNC_BYTE_2;之后:

                    |        |
                    +--------+
pCommandData --+    |  0x5A  |
               |    +--------+
               |    |  0xA5  |
               |    +--------+
               +--> |        |
                    +--------+
                    |        |

答案 1 :(得分:8)

此:

UINT8 *pCommandData;
*pCommandData++ = SYNC_BYTE_1;
*pCommandData++ = SYNC_BYTE_2;

相当于:

UINT8 *pCommandData;
*pCommandData = SYNC_BYTE_1;
pCommandData++;
*pCommandData = SYNC_BYTE_2;
pCommandData++;

或:

UINT8 *pCommandData;
pCommandData[0] = SYNC_BYTE_1;
pCommandData[1] = SYNC_BYTE_2;
pCommandData += 2;

答案 2 :(得分:2)

构造:

  

* pCommandData ++ = SYNC_BYTE_1;

只需将pCommandData指向的值设置为SYNC_BYTE_1,然后将指针递增以指向下一个位置。由于pCommandData是指向无符号8位整数的指针,这意味着它将递增以指向下一个(后续)8位值。

答案 3 :(得分:1)

指针本身正在递增,指向下一个字节。

这与它的写法完全相同:

*pCommandData = value;
pCommandData++;

您可以使用&pCommandData来获取指针本身的地址,但这不是这里发生的事情。使用*pCommandData可以访问指针指向的对象(如果有的话: - )。

答案 4 :(得分:1)

效果:

*pCommandData++ = SYNC_BYTE_1;

是:

*pCommandData = SYNC_BYTE_1;
 pCommandData++;

答案 5 :(得分:0)

pCommandData指向的数据块设置为0x5A,然后指针设置为下一个字节,该字节本身设置为0xA5。最后,指针被设置为内存中的下一个字节。

您可以将代码重写为以下内容:

*pCommandData = SYNC_BYTE_1;
pCommandData = pCommandData + 1;
*pCommandData = SYNC_BYTE_2;
pCommandData = pCommandData + 1;

答案 6 :(得分:0)

它将同步字节值放入pCommandData,这就是为什么你看到* pCommandData,然后你将它递增到下一个字节。

答案 7 :(得分:0)

表达式

*p++ = rval ;

读作

*(p ++)= rval;

指示编译器

  1. p的值保存为p1。
  2. 增量p
  3. 取消引用p1
  4. rval的值分配给已取消引用的内容。
  5. 编辑注意:除非你清楚运算符优先级,否则我永远不会写*p++,因为它非常混乱。通过明确地写*(p++)来明确我的意图。

答案 8 :(得分:0)

Postfix ++的优先级高于一元*,因此*p++形式的表达式会被解析为*(p++); IOW,您正在取消引用p++结果

在您的代码中,这意味着什么?

鉴于表达式*pCommandData++ = SYNC_BYTE_1,这里是对正在发生的事情的粗略解释:

  1. 评估表达式pCommandData++。表达式的结果pCommandData的当前值,它是指针值。作为副作用pCommandData的值会更新。确切地说,在发生此更新时,未指定它必须在下一个序列点之前发生。

  2. 使用pCommandData++运算符取消引用表达式*结果。这个更大的表达式的结果是 lvalue (一个表达式,它引用内存中的一个对象,以便我们可以读取或修改该对象)。

  3. 我们将值SYNC_BYTE_1分配给在步骤2中计算的左值。

  4. 从语义上讲,它与写作相同:

    *pCommandData = SYNC_BYTE_1;
     pCommandData++;