对 C++ 中的指针引用感到困惑

Confused with references on pointers in C++

任务是在没有计算机的情况下计算以下源代码的输出,我会说是"123 234 678 678",因为ref1是对ptr值的引用和在 val2 的地址被分配给这个指针的那一刻, ref1 不应该也引用它的值吗?

int main() {
    int* ptr = nullptr;
    int val1 = 123, val2 {234};
    ptr = &val1;
    int& ref1 = *ptr;
    int& ref2 = val2;

    std::cout << ref1 << " ";
    std::cout << ref2 << " ";
    *ptr = 456; //ref1 = 456
    ptr = &val2; //*ptr = 234, why isn't ref1 as well equal to 234?
    *ptr = 678; //*ptr = 678, why isn't ref1 as well equal to 678?

    std::cout << ref1 << " ";
    std::cout << ref2 << "\n";

    return EXIT_SUCCESS;

    //output: 123 234 456 678
}

在此声明之后

int& ref1 = *ptr;
int& ref2 = val2;

ref1指的是val1ref2指的是val2。声明后引用不能更改为引用其他变量。

注意引用ref1不引用指针ptr。由于取消引用指向变量 val1.

的指针,它引用变量 val1

所以这些陈述

std::cout << ref1 << " ";
std::cout << ref2 << " ";

会输出

121 234

在此声明中

*ptr = 456;

变量val1的值通过指针ptr更改为456

之后指针ptr的值被改成存放变量val2

的地址
ptr = &val2;

并通过指针

将变量val2的值改为678
*ptr = 678;

所以这些陈述

std::cout << ref1 << " ";
std::cout << ref2 << "\n";

现在会输出

456 678

也就是说,它们输出引用所指变量的值。

在这个程序中,同一个指针被用来改变两个不同对象的值,因为用对象的地址重新分配了指针。