Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针和指向该指针的地址指向同一事物_C++_C_Pointers - Fatal编程技术网

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不是字节,所以它们是相同的。实际上,数组和指针之间是有区别的