2

我正在使用二进制文件结构。读取数据的代码示例是C语言的,我需要在Delphi中读取。我赶紧补充一下我没有C编程经验。

鉴于以下

typedef struct {
uchar ID, DataSource;
ushort ChecksumOffset;
uchar Spare, NDataTypes;
ushort Offset [256];
} HeaderType; 

...

typedef struct {
ushort ID;
...
ushort DistanceToBin1Middle,TransmitLength;
} FixLeaderType;

...

HeaderType *HdrPtr;
FixLeaderType *FLdrPtr;

unsigned char RcvBuff[8192];
void DecodeBBensemble( void )
{
unsigned short i, *IDptr, ID;
FLdrPtr = (FixLeaderType *)&RcvBuff [ HdrPtr->Offset[0] ];
if (FLdrPtr->NBins > 128)
FLdrPtr->NBins = 32;

...

我难以理解的一点是:

FLdrPtr = (FixLeaderType *)&RcvBuff [ HdrPtr->Offset[0] ];

据我了解,[ HdrPtr->Offset[0] ]; 会从 HdrPtr 指向的 HeaderType 结构返回第一个 Offset 数组项的值吗?那么等价于HdrPtr^.Offset[0]?

那么&RcvBuff [ HdrPtr->Offset[0] ];应该返回包含索引的 RcvBuff 数组项的值的内存地址,所以相当于@RecBuff[HdrPtr^.Offset[0]]

然后我迷路了(FixLeaderType *)..。有人可以帮助解释 FldrPtr 所引用的确切内容吗?

4

2 回答 2

4

相关的代码位是

FixLeaderType *FLdrPtr; 
unsigned char RcvBuff[8192]; 

FLdrPtr = (FixLeaderType *)&RcvBuff [ HdrPtr->Offset[0] ]; 
  1. FldPtr是 类型FixLeaderType *,或指向 的指针FixLeaderType
  2. RcvBuff是一个数组char
  3. HdrPtr->Offset[0]解析为一个 ushort 值,因此RcvBuff [ HdrPtr->Offset[0] ]产生一个char值。
  4. &意味着char返回值的地址而不是获取值。请注意,这意味着它的类型为char *.
  5. char *类型是分配给的错误类型FldPtr。转换类型以(FixLeaderType *)使其有效。这称为强制转换操作。
于 2010-04-27T13:56:58.260 回答
3

我认为您应该阅读以下内容:

* = pointer to

& = address of

这让事情变得容易多了

于 2010-04-27T13:43:07.267 回答