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;
答案 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 ++没有做出这样的保证。
您还问过为什么在第二次运行程序时,y
和p
的地址不同。 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的图有助于理解++或 - 操作。