引用指针(*&)语法

时间:2014-07-03 15:29:02

标签: c++ c pointers struct reference

我正在查看将命令从一个硬件发送到另一个硬件的代码。下面是一个片段。

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中,为什么包含它?

感谢您的帮助。

4 个答案:

答案 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

我最好通过精彩集锦向您展示您感兴趣的所有相关内容。

enter image description here

答案 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