给定问题的答案,对被取消引用的指针的引用地址是否与指针的地址相同? 以及我目前对引用的理解,我非常困惑,当我检查向量元素的地址,并将它们与那些元素的引用地址进行比较时:
#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
所以第一个元素的地址和对第一个元素的引用的地址是相同的,但是所有其他的都不是。 这是为什么?
这是一个简单的错误:声明中的&
只适用于ref0
,其他都是非引用类型!
你想要
const int
&ref0 { vec[0] },
&ref1 { vec[1] },
&ref2 { vec[2] },
&ref3 { vec[3] };
这在诸如int*p,q;
之类的指针声明中更常见。