作用上的不同
&作为引用是某一变量(目标)的一个别名,必须在定义时候就进行初始化,若不进行初始化则会编译报错。
&作为取地址时,用来获取指针指向的元素所在内存中的地址值。
用法上的不同
和类型在一起的是引用,和变量在一起的是取址(表现形式为:引用在赋值=的左边,而取地址在赋值的右边)
int a=3;
int &b=a; //引用
int *p=&a; //取地址
在做C++Primer第五版练习3.41时:编写一段程序,用整型数组初始化一个vector对象。 发现“&引用”和“&取地址”的区别分辨不清。
//问题的参考答案如下
#include<iostream>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
const int sz = 10; //常量sz作为数组的维度
int a[sz];
srand((unsigned)time(NULL)); //生成随机种子
cout << "数组的内容时:" << endl;
//利用范围for循环遍历数组的每个元素
for (auto &val : a)
{
val = rand() % 100; //生成一个100以内的随机数
cout << val << " ";
}
cout << endl;
//利用begin和endi初始化vector对象
vector<int> vInt(begin(a), end(a));
cout << "vector内容是:" << endl;
//利用范围for循环遍历vector的每个元素
for (auto val : vInt)
{
cout << val << " ";
}
cout << endl;
return 0;
}
问题出在利用范围for循环生成随机数上,我将其中的&认为成了取址符,导致我不理解为什么会通过取val的地址并为数组a[ ]每个元素赋值。
for (auto &val : a)
{
val = rand() % 100; //生成一个100以内的随机数
cout << val << " ";
}
为了验证疑惑,利用输出验证c的类型
#include <iostream>
#include <ctime>
#include <vector>
#include <cstdlib>
using namespace std;
int main()
{
const int sz = 10;
int a[sz];
srand((unsigned)time(NULL));
int i = 0;
//利用范围for循环生成随机数
for (auto &c : a)
{
c = rand() % 100;
cout << c << " " << &a[i] << " " << a[i] << endl;
i += 1;
}
}
cout << c << " " << &a[i] << " " << a[i] << endl;
的输出结果为:
可以发现c不是地址,因为和&a[i]的数值差异太大,而和a[i]的数值相等,故推断c可能是int型数值。
再根据引用的知识我们可以清晰的知道,这个就是引用。