提问者:小点点

向量元素引用的地址与它所指向的向量元素具有不同的地址。 为什么? [副本]


给定问题的答案,对被取消引用的指针的引用地址是否与指针的地址相同? 以及我目前对引用的理解,我非常困惑,当我检查向量元素的地址,并将它们与那些元素的引用地址进行比较时:

#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

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


共1个答案

匿名用户

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

你想要

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

这在诸如int*p,q;之类的指针声明中更常见。