指针和该指针的地址导致相同的事情

当我看到这些线条时:

BYTE MessageToProcess[MAX_MESSAGE_LENGTH]; TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)&MessageToProcess; 

我对自己说,第二行必须是这样的:

 TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)MessageToProcess; 

但是当我检查调试模式时,“pHdr”指向与两个示例中的“MessageToProcess”相同的东西,而在第一个代码中的MessageToProcess之前有一个“&”,所以通常pHdr应该包含MessageToProcess的地址而不是它指向的字节的地址,例如,messageToProcess中的第一个元素。

那么问题是怎么回事? 我们正在处理指向字节而不是函数的指针,因此添加&必须更改等式。

稍后在代码中我们使用pHdr,如下所示:

 pHdr->size+2 

但最初,在第一个代码中,它确实包含将地址保存到数组的第一个字节的指针的地址。

变量MessageToProcess是一个数组。 它放在记忆中的某个地方。 通过使用&MessageToProcess我们得到存储数组的内存中的那个地址。 &MessageToProcess的类型是BYTE (*)[MAX_MESSAGE_LENGTH]

当你使用没有address-of运算符的MessageToProcess ,它会衰减到指向第一个元素的指针,即&MessageToProcess[0] 。 那种类型是BYTE *

对于像问题中显示的示例那样简单的事情,这两个地址是相同的。 当你尝试用这些指针做更多的事情时,会出现差异。 例如,如果你做(&MessageToProcess)[1]你将得到与执行MessageToProcess[1]时相同的事情。


为了略微可视化,我们可以说我们有以下定义:

 int a[4] = { 0, 1, 2, 3 }; 

那就是这样的:

 &a&a + 1
 |  |
 VV
 + --- + --- + --- + --- +
 |  0 |  1 |  2 |  3 |
 + --- + --- + --- + --- +
 ^ ^
 |  |
 a + 1

MessageToProcess是一个数组。

在数组的情况下,数组的基地址可以通过以下方式表示:

&MessageToProcessMessageToProcess OR &MessageToProcess[0]