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

时间:2016-03-03 11:44:40

标签: c++ c pointers

当我看到这些线条时:

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

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

TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)MessageToProcess;

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

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

稍后在代码中我们使用这样的pHdr:

pHdr->size+2

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

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是一个数组。

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

&MessageToProcessMessageToProcess&MessageToProcess[0]