当我看到这些行时:

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]

当您使用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 + 1

关于c++ - 指针和指向该指针的地址导致同一件事,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35771298/

10-11 23:07