C++ 指针和指向该指针的地址指向同一事物
当我看到这句话时:C++ 指针和指向该指针的地址指向同一事物,c++,c,pointers,C++,C,Pointers,当我看到这句话时: BYTE MessageToProcess[MAX_MESSAGE_LENGTH]; TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)&MessageToProcess; 我对自己说第二行一定是这样的: TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)MessageToProcess; 但是,当我在调试模式中选中时,“pHdr”在两个示例中都指向与“MessageToProcess”相同的东西,而在第
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
或&MessageToProcess[0]
变量MessageToProcess
是一个数组。它被放在记忆的某个地方。通过使用&MessageToProcess
我们可以获得存储阵列的内存中的位置的地址。&MessageToProcess
的类型是字节(*)[最大消息长度]
当您使用不带运算符地址的MessageToProcess
时,它会衰减为指向第一个元素的指针,即&MessageToProcess[0]
。其类型为字节*
对于问题中所示的简单示例,这两个地址是相同的。当你试图用这些指针做更多的事情时,区别就来了。例如,如果您执行(&MessageToProcess)[1]
,您将不会得到与执行MessageToProcess[1]
时相同的结果
为了将其形象化,假设我们有以下定义:
int a[4] = { 0, 1, 2, 3 };
然后是这样的:
&a &a+1
| |
v v
+---+---+---+---+
| 0 | 1 | 2 | 3 |
+---+---+---+---+
^ ^
| |
a a+1
&a&a+1
| |
v v
+---+---+---+---+
| 0 | 1 | 2 | 3 |
+---+---+---+---+
^ ^
| |
a+1
数组衰减为指针。您可以在任何有关该语言的书籍中找到解释。例如char**,指向指针类型的指针与指针类型不同。此代码可能有未定义的行为,请检查。@Lundin CPPCheck在有关行所在的文件中未发现任何问题。是的,这是一个问题。这使这个问题难以回答。特别是,不可能从语言规范中引用有问题的行为。也很难证明它是否是未定义的行为。我提到的那个人可能有这个问题。这是一个很好的教训,为什么问题不应该被标记C和C++,除非他们真正关心的互操作性或交叉口之间的两种语言。没有理由相信Aminos用C和C++编译器编译这个代码。因此,如果MasaGeToPro是一个动态数组BythMasaGePosie=新字节[Max SmithAgLimeLime],上面的第一个代码就不应该是有效的:TCPIpPACKETDRR PHDR=(TCPIPACKEKTHDR)和MasaGeToPur程;现在已经不正确了。“我说得对吗?”阿米诺说得对。如果
MessageToProcess
是指针变量,那么执行&MessageToProcess
是指针变量的指针,即字节**
。现在一切都清楚了。令人惊讶的是,我仍然在C/C++中发现一些东西。我理解为什么像Java和Python这样的新语言现在更受欢迎。我认为&MessageToProcess[0]不同于&MessageToProcess,但由于MessageToProcess不是字节,所以它们是相同的。实际上,数组和指针之间是有区别的