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

pointer and address to that pointer lead to the same thing

本文关键字:指针 地址      更新时间:2023-10-16

当我看到这些行时:

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|              |五 五+---+---+---+---+|0 |1 |2 |3 |+---+---+---+---+^   ^|  |A A+1
MessageToProcess是一个

数组。

对于数组,数组的基址可以通过以下方式替代:

&MessageToProcessMessageToProcess&MessageToProcess[0] .