当我看到这些线条时:
BYTE MessageToProcess[MAX_MESSAGE_LENGTH];
TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)&MessageToProcess;
我对自己说第二行必须是这样的:
TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)MessageToProcess;
但是当我在调试模式中检查时,“pHdr”指向两个示例中的“MessageToProcess”相同的东西,而有一个“&”在第一个代码中的MessageToProcess之前,通常pHdr应该包含MessageToProcess的地址,而不是它指向的字节的地址,例如,messageToProcess中的第一个元素。
那么问题是怎么回事?我们正在处理指向字节而不是函数的指针,因此添加&必须改变等式。
稍后在代码中我们使用这样的pHdr:
pHdr->size+2
但最初,在第一个代码中,它确实包含将地址保存到数组的第一个字节的指针的地址。
答案 0 :(得分:8)
变量MessageToProcess
是一个数组。它放在记忆中的某个地方。通过使用&MessageToProcess
,我们可以在存储阵列的内存中获取该位置的地址。 &MessageToProcess
的类型为BYTE (*)[MAX_MESSAGE_LENGTH]
。
当你使用MessageToProcess
而不使用address-of运算符时,它会衰减到指向第一个元素的指针,即&MessageToProcess[0]
。其类型为BYTE *
。
对于像问题中显示的示例那样简单的事情,这两个地址是相同的。当你尝试用这些指针做更多的事情时,会出现差异。例如,如果您执行(&MessageToProcess)[1]
,则不会与执行MessageToProcess[1]
时的内容相同。
为了略微可视化,我们可以说我们有以下定义:
int a[4] = { 0, 1, 2, 3 };
然后是这样的:
&a &a+1 | | v v +---+---+---+---+ | 0 | 1 | 2 | 3 | +---+---+---+---+ ^ ^ | | a a+1
答案 1 :(得分:3)
MessageToProcess
是一个数组。
在数组的情况下,数组的基地址可以通过以下方式表示:
&MessageToProcess
或MessageToProcess
或&MessageToProcess[0]
。