打印时前一指针的值不同

时间:2018-01-19 20:46:49

标签: c++ pointers

int x=2,y=3,*p;
p = &x;
cout<<p<<"\t"<<*p<<"\n"; //0x6dfef4    2
--p;
cout<<p<<"\t"<<*p<<"\n"; //0x6dfef0    1969648845

为什么当p是--p之前的指针是另一个数字。没有cout

但是当我打印x和y值的地址不同时

int x=2,y=3,*p;
p = &x;
cout<<p<<"\t"<<*p<<"\n"; // 0x6dfef8        2
--p;
cout<<p<<"\t"<<*p<<"\n"; // 0x6dfef4        3
cout<<"Adress x = "<<&x<<"\n" // Adress x = 0x6dfef8;
cout<<"Adress y = "<<&y<<"\n" // Adress y = 0x6dfef4;

2 个答案:

答案 0 :(得分:3)

我怀疑你对--p的所作所为感到困惑。表达式--p并不意味着&#34;减少p指向的数字。&#34;

要了解此处发生了什么,请想一想,最初,p指向x,如下所示:

     +-----------+          +---------+
   p | address A |  ---->   |    2    | x
     +-----------+          +---------+

当您编写--p时,C ++会将此解释为&#34;更改p指向的位置,以便它在x之前查看内存中的整数。&#34 ;看起来像这样:

                            +---------+
                      +-->  | ??????? | (not a variable)
     +-----------+    |     +---------+
   p | address B |  --+     |    2    | x
     +-----------+          +---------+

请注意,p现在指向内存中的其他位置,并且无法保证其中int实际上是p。此时您实际上正在读取垃圾值。这就是为什么你会在*p中看到一个新地址(因为你已经改变它指向的位置)和y的新值(因为你&#39} ;从内存中拉出随机字节)。请注意,当您这样做时,不保证您指向x; C ++没有做出这样的保证。

您还问过为什么在第二次运行程序时,yp的地址不同。 C ++并不能保证在程序的多次运行中,相同的变量最终会处于相同的位置。事实上,许多操作系统会随机化变量实际上最终在每次运行中被分配的位置,因此这就是预期的行为。

如果您想将y更改为指向p = &y;,请填写p。这明确指出它指向if($message || $postback) { if($message){ $qr = isset($input['entry'][0]['messaging'][0]['message']['quick_reply']['payload']) ? $input['entry'][0]['messaging'][0]['message']['quick_reply']['payload']: '' ; if(!empty($qr)){ if(preg_match('[postback payload from qr]', strtolower($qr))){ $message_to_reply = "Something for the user"; $jsonData = defaultJSON($sender, $message_to_reply); } } //Some Basic rules to validate ("chat") incoming messages if(preg_match('[hey]', strtolower($message))) { $message_to_reply = "welcome message to the user"; $jsonData = jsonQuickReplies($sender, $message_to_reply); }else { $message_to_reply = "default message not knowing what the user said"; $jsonData = defaultJSON($sender, $message_to_reply); //MISSING BRACE }else if($postback){ // If Page receives Postback, process the Postback and prepare content to reply if(preg_match('[duda]', strtolower($postback))){ $message_to_reply = "process postback"; $jsonData = defaultJSON($sender, $message_to_reply); } } } 。指针算法仅在数组的上下文中有效(这里有一些技术注意事项不值得详细说明。)

答案 1 :(得分:2)

第一个代码中。通过做--p。指针移回4字节位置(在这种情况下你应该编译为32位,整数是4字节大小)所以地址是0x6dfef8 - 4 = 0x6dfef4。这个内存地址的值是随机的1969648845,因为谁知道编译器在这个地址中添加了什么...当然没有。

第二代码中,0x6dfef4的值为3,因为编译器应该在此地址保存y变量值(0x6dfef4应该是y的地址)。这是一个&#34;随机&#34;结果取决于编译器/链接器,y可以是0x6dfefc或其他地址。当您使用代码检查x和y变量地址时:

cout<<"Adress x = "<<&x<<"\n" // Adress x = 0x6dfef8;
cout<<"Adress y = "<<&y<<"\n" // Adress y = 0x6dfef4;

确认x和y是并排的地址。

如果您在第一个代码中执行相同的地址打印测试,您应该看到y不在0x6dfef0地址。

什么是POINTER

任何变量都位于内存中的地址中,此地址包含一个大小(某些字节为2(16位),4位(32位),8位(64位))的值。当此变量的值是adresse值时,我们将此变量称为指针。

我希望指针的这种解释能帮助一些人更好地理解。像这样http://www.cplusplus.com/doc/tutorial/pointers/pointer_arithmetics.png的图有助于理解++或 - 操作。