当我看到这些行时:
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/