我正在查看将命令从一个硬件发送到另一个硬件的代码。下面是一个片段。
unsigned char data[3];
msg_header *mHead; //pointer of struct msg_header
mHead = (msg_header *) &data;
mHead->startByte = START_BYTE;
mHead->ID = GET_TELEM; //0x30
mHead->length = 0;
结构msg_header在头文件中定义。
typedef struct {
unsigned char startByte;
unsigned char ID;
unsigned char length;
// unsigned char from;
} msg_header;
有人可以解释mHead = (msg_header *) &data;
实际在做什么吗?
我知道*&正在创建对指向数据的指针的引用,但为什么msg_header在parantheses中,为什么包含它?
感谢您的帮助。
答案 0 :(得分:8)
它将data
的地址转换为msg_header*
类型 - 指向msg_header
的指针。
没有人提及。 &
可用于获取变量的地址。
答案 1 :(得分:4)
许多运营商在不同情况下做不同的事情。例如,&符号可用于标记某些内容(C ++特定),它可用作按位和操作,也可用于获取某些内容的地址。
在你的情况下,它是最后一件事。它获取数组data
的地址,然后将其转换为指向结构的指针。所以它是一个带有两个不同操作的表达式。
答案 2 :(得分:2)
mHead = (msg_header *) &data;
所做的事情是将data
的地址写入mHead
。在此之后' mHead'指出相同的地址是什么'数据'之前指出过。这是因为ampersand
在这种情况下的工作是返回地址。但在这个特殊情况下
即使没有&
,你也可以这样做,就像这个mHead = (msg_header *) data;
一样,这种情况完全相同。这是因为数组本身就是一个地址。
为了更好地理解它,你可以运行实验来打印所有的东西。我为你的代码添加了这样的打印。
typedef struct {
unsigned char startByte;
unsigned char ID;
unsigned char length;
// unsigned char from;
} msg_header;
int main (void)
{
unsigned char data[3];
printf ("\nThe address of my data[3] is: 0x%x\n",data);
printf ("The address of my data[3] is: 0x%x\n",& data);
printf ("The address of my data[3] is: 0x%x\n\n",& data[0]);
msg_header *mHead; //pointer of struct msg_header
//printf ("The address of my mHead is: 0x%x\n", mHead);
printf ("The address of my mHead, is: 0x%x\n\n",& mHead);
mHead = (msg_header *) &data;
printf ("The pointer of my `mHead`, AFTER it is set, is: 0x%x\n\n", mHead);
printf ("The `int` value kept in the location of my `mHead` points to, BEFORE the pointer is set: 0x%x\n\n", * mHead);
printf ("The `unsigned char` value kept in the location of my mHead points to, BEFORE the pointer is set: 0x%x\n\n", *(unsigned char *) mHead);
mHead->startByte = 0xAA;
printf ("The `int` value kept in the location of my `mHead` points to, AFTER the pointer is set: 0x%x\n\n", * mHead);
printf ("The `unsigned char` value kept in the location of my `mHead` points to, AFTER the pointer is set: 0x%x\n\n", *(unsigned char *) mHead);
mHead->ID = 0x30; //0x30
mHead->length = 0;
}
在我的平台上,我得到了下面的输出,但在你的情况下,它肯定会有所不同。但从技术上讲,它几乎在每个平台上的工作方式相同。
我的数据[3]的地址是:0xb4ea01a0我的数据[3]的地址是: 0xb4ea01a0我的数据[3]的地址是:0xb4ea01a0
我的mHead的地址是:0xb4ea01a8
我的
mHead
指针在设置之后是:0xb4ea01a0
int
值保留在我的mHead
位置之前 指针设置为:0xb4ea0290保留在我的mHead位置的
unsigned char
值指向, 在指针设置之前:0x90我的
int
位置保留的mHead
值指向,AFTER 指针设置为:0xb4ea02aa
unsigned char
值保留在mHead
点的位置 to,指针设置后:0xaa
我最好通过精彩集锦向您展示您感兴趣的所有相关内容。
答案 3 :(得分:1)
可能这可以帮助您想象正在发生的事情 -
通常,内存中struct msg_header
的布局就像
+-----------+-----------+-----------+
| startByte | ID | length |
+-----------+-----------+-----------+
|<-1 byte ->|<-1 byte ->|<-1 byte ->|
和,数组unsigned char data[3];
的布局
+-----------+-----------+-----------+
| data[0] | data[1] | data[2] |
+-----------+-----------+-----------+
|<-1 byte ->|<-1 byte ->|<-1 byte ->|
表达式
(msg_header *) &data;
将数组data
的(布局)转换为结构msg_header
的数组,以便可以将单个字节读入结构中。
括号用于对运算符进行分组并强制使用不同的优先级。 http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm