【问题标题】:Address of reference to a vector element has different address than the vector element it points to. Why? [duplicate]向量元素的引用地址与其指向的向量元素的地址不同。为什么? [复制]
【发布时间】:2020-11-02 15:17:39
【问题描述】:

鉴于问题Is the address of a reference to a dereferenced pointer the same as the address of the pointer?的答案以及我目前对引用的理解,当我检查向量元素的地址并将它们与这些元素的引用地址进行比较时,我感到非常困惑:

#include <iostream>
#include <vector>

int main(){
    std::vector<int> vec { 1, 2, 3, 4 };
    const int&
        ref0 { vec[0] },
        ref1 { vec[1] },
        ref2 { vec[2] },
        ref3 { vec[3] };

    std::cout
        << &(vec[0]) << " vs " << &ref0 << "\n"
        << &(vec[1]) << " vs " << &ref1 << "\n"
        << &(vec[2]) << " vs " << &ref2 << "\n"
        << &(vec[3]) << " vs " << &ref3 << "\n";

    return 0;
}

在我的机器上输出(Ubuntu 20.04,用 g++ 9.3.0 编译,默认选项):

0x561553dbdeb0 vs 0x561553dbdeb0
0x561553dbdeb4 vs 0x7fff539f4d6c
0x561553dbdeb8 vs 0x7fff539f4d70
0x561553dbdebc vs 0x7fff539f4d74

所以第一个元素的地址和第一个元素的引用地址是一样的,但其他的都不一样。这是为什么呢?

【问题讨论】:

    标签: c++ reference memory-address


    【解决方案1】:

    这是一个简单的错字:声明中的&amp;仅适用于ref0,其他都是非引用类型!

    你想要吗

    const int
            &ref0 { vec[0] },
            &ref1 { vec[1] },
            &ref2 { vec[2] },
            &ref3 { vec[3] };
    

    int* p, q; 之类的指针声明更容易出现这种情况。

    【讨论】:

    • 对!我很少连续声明几个变量,所以我忘记了!
    • @RL-S:我们都做到了!也许这是一个年龄问题,但我认为参考文献更容易陷入这个陷阱。几年前,我修复了一个可怕的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 2018-08-23
    • 2019-05-23
    相关资源
    最近更新 更多