给出以下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;
我特别不理解在此实例中使用*
和++
。如果指针的地址递增,*
是否应该用&
替换?
答案 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;
指示编译器
p
的值保存为p1。rval
的值分配给已取消引用的内容。编辑注意:除非你清楚运算符优先级,否则我永远不会写*p++
,因为它非常混乱。通过明确地写*(p++)
来明确我的意图。
答案 8 :(得分:0)
Postfix ++
的优先级高于一元*
,因此*p++
形式的表达式会被解析为*(p++)
; IOW,您正在取消引用p++
的结果。
在您的代码中,这意味着什么?
鉴于表达式*pCommandData++ = SYNC_BYTE_1
,这里是对正在发生的事情的粗略解释:
评估表达式pCommandData++
。表达式的结果是pCommandData
的当前值,它是指针值。作为副作用,pCommandData
的值会更新。确切地说,在发生此更新时,未指定它必须在下一个序列点之前发生。
使用pCommandData++
运算符取消引用表达式*
的结果。这个更大的表达式的结果是 lvalue (一个表达式,它引用内存中的一个对象,以便我们可以读取或修改该对象)。
我们将值SYNC_BYTE_1分配给在步骤2中计算的左值。
从语义上讲,它与写作相同:
*pCommandData = SYNC_BYTE_1;
pCommandData++;