c++ - 打印时前一个指针的值不同

标签 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 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++ 不提供这种保证。

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

如果你想改变p指向y,只需要写p = &y;。这明确地将其指定为指向 p。指针算法仅在数组上下文中有效(有一些技术警告不值得在这里详细说明。)

关于c++ - 打印时前一个指针的值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48349300/

相关文章:

c++ - 如何使用 C++/Boost 从字符串中过滤字符

C 指针 : difference between while(*s++) { ;} and while(*s) { s++;}

c - C 中的 "Error: array subscript is not an integer"带指针

c - 如何将用户在 C 中输入的字符传递给 printf?

c++ - 尝试重新分配内存时出现写访问冲突

c++ - 我的位级添加功能总是将第一位设置为 0

c++ - 找不到 Visual Studio 平台 2015 工具集 ='v141'

c++ - 如何使 2D vector 中的每个 vector 不同?

c++ - *&var 是多余的吗?

c++ - 不是 'tagINPUT' 的成员