C++中“&引用”和“&取地址”的区别

作用上的不同
&作为引用是某一变量(目标)的一个别名,必须在定义时候就进行初始化,若不进行初始化则会编译报错。
&作为取地址时,用来获取指针指向的元素所在内存中的地址值。

用法上的不同
和类型在一起的是引用,和变量在一起的是取址(表现形式为:引用在赋值=的左边,而取地址在赋值的右边)

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型数值。

再根据引用的知识我们可以清晰的知道,这个就是引用。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值