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 previous pointer 是另一个数字。没有计算
但是当我打印 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;
最佳答案
我怀疑您对 --p
的作用感到困惑。表达式 --p
并不意味着“减少 p
指向的数字。”
要了解这里发生了什么,想象一下,最初,您有 p
指向 x
,如下所示:
+-----------+ +---------+
p | address A | ----> | 2 | x
+-----------+ +---------+
当您编写 --p
时,C++ 将其解释为“更改 p
指向的位置,以便它查看内存中 x 之前的整数
。”看起来像这样:
+---------+
+--> | ??????? | (not a variable)
+-----------+ | +---------+
p | address B | --+ | 2 | x
+-----------+ +---------+
请注意 p
现在指向内存中的其他地方,并且不能保证那里确实有一个 int
。此时您实际上是在读取垃圾值。这就是为什么您会看到 p
中存储了一个新地址(因为您已经更改了它指向的位置)和 *p
的新值(因为您正在提取随机字节从内存里)。请注意,当您执行此操作时,不能保证您指向 y
; C++ 不提供这种保证。
您还问过为什么第二次运行程序时 x
和 y
的地址不同。 C++ 不保证在程序的多次运行中,相同的变量最终会出现在相同的位置。事实上,许多操作系统会在每次运行时随机分配变量实际最终分配的位置,因此这是预期的行为。
如果你想改变p
指向y
,只需要写p = &y;
。这明确地将其指定为指向 p
。指针算法仅在数组上下文中有效(有一些技术警告不值得在这里详细说明。)
关于c++ - 打印时前一个指针的值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48349300/