在 c++ 中使用指针时出现奇怪的输出

Strange output when use Pointers in c++

提问人:S Ali Mousavi 提问时间:6/7/2022 最后编辑:Vlad from MoscowS Ali Mousavi 更新时间:6/7/2022 访问量:109

问:

考虑以下 c++ 代码:

#include <iostream>

using namespace std;

int main() {
    int x=2, y;
    int *p = &x;
    int **q = &p;
    std::cout << p << std::endl;
    std::cout << q << std::endl;
    std::cout << *p << std::endl;
    std::cout << x << std::endl;
    std::cout << *q << std::endl;

    *p = 8;
    *q = &y;

    std::cout << "--------------" << std::endl;

    std::cout << p << std::endl;
    std::cout << q << std::endl;
    std::cout << *p << std::endl;
    std::cout << x << std::endl;
    std::cout << *q << std::endl;

    return 0;
}

代码的输出是(当然列表编号不是输出的一部分):

  1. 0x7fff568e52e0
  2. 0x7fff568e52e8
  3. 2
  4. 2
  5. 0x7fff568e52e0
  6. '-----------'
  7. 0x7fff568e52e4
  8. 0x7fff568e52e8
  9. 0
  10. 8
  11. 0x7fff568e52e4

除了 7 和 9,所有输出都是我预期的。我很感激有人向我解释它们。

C++ 指针赋 值运算符 取消引用

评论

2赞 user17732522 6/7/2022
当您询问 C++ 程序时,请不要标记 C。这是两种截然不同的编程语言。
4赞 Eljay 6/7/2022
7 是 的地址。9 是由于未定义的行为,因为从未初始化。yy
0赞 S Ali Mousavi 6/7/2022
@Eljay 你能解释更多吗?p 是由 &x 初始化的指针,在编码过程中不会更改。我期望它与输出 1 相同。
1赞 Eljay 6/7/2022
*q = &y;实际上与 because 别名(通过间接)相同。这意味着在代码过程中确实发生了变化(间接地,通过 )。p = &y;*qpp*q
0赞 S Ali Mousavi 6/7/2022
@PeteBecker我能够毫无错误地执行代码。

答:

2赞 Vlad from Moscow 6/7/2022 #1

变量未初始化y

int x=2, y;

所以它有一个不确定的值。

当指针指向指针时qp

int **q = &p;

然后取消引用指针,你会得到一个对指针的引用。 所以这个赋值语句qp

*q = &y;

其实相当于

p = &y;

也就是说,在赋值之后,指针包含变量的地址。py

所以这个电话

std::cout << p << std::endl;

现在输出变量的地址。y

  1. 0x7fff568e52e4

和这个电话

std::cout << *p << std::endl;

输出 that 的不确定值 happy 等于 0。y

9. 0