指向引用的指针和 对指针的引用

首先我们知道引用这一技术相当于给被引用的变量起别名,使用引用后的别名其实跟使用原变量是一样的,这样看来确实是跟指针有点相似,指针是一个指向变量地址的实体存在,指针本身也是存在的,指针也有自己的地址,但是引用就不一样,引用本身并没有独立再开辟出一个新的实体,他只是原来变量的一个别名,其地址其实还是原来变量的地址
如下所示

#include <iostream>
using namespace std;

void test01()
{
	int a = 10;
	int* p = &a;//指针
	int& t = a;//引用

	cout << &a << endl;//输出a的地址
	cout << &p << endl;//输出p的地址
	cout << p << endl;//输出p指针指向的地址,即a的地址
	cout << &t << endl;//输出a的引用t的地址
}

int main()
{
	test01();

	return 0;
}

输出在这里插入图片描述
从输出后的结果可以发现引用的地址其实也是原变量的地址,并没有产生新的实体,但是指针确实有自己的地址,这是毋庸置疑的,不然二级指针就没有意义;但是却没有二级引用这一说法,因为引用只是一个变量的别名而已,给别名起别名,无疑是脱裤子放屁,直接给原变量起别名不就行了吗。

#include <iostream>
using namespace std;

void test01()
{
	int a = 10;
	int& b = a;
	int* p = &a;
	//int&* t1 = &b; //指向引用的指针,报错
	int *& t2 = p; //指向指针的引用
}

int main()
{
	test01();

	return 0;
}

判断定义变量的类型的技巧就是将定义语句从右向左看,将离变量名最近的符号视为最关键的符号;例如 int &t1 = &b;将这个语句分成两部分,
(int
)(&t2) = p;最关键的符号就是&,那这个t2就是一个引用 ;引用的类型是一个int*类型的变量,就是一个指针,也就是一个对指针的引用。
相对于(int&)(*t1) = &b;关键符号是 *,表明t1是一个指针,指针指向的类型是一个int&类型,也就是一个引用的类型,说明这是一个指向引用的指针;但是显然编译器报错了,说明指向引用的指针是不合法的。

#include <iostream>
using namespace std;

void test01()
{
	int a[10] = {1}, b;
	int& c = b;
	//int &d[10] = a;//对数组的引用,报错,
	int(&d1)[10] = a; //引用数组,给数组起别名是可以的,不报错
	//int&& t = c;//对引用的引用,报错
}

int main()
{
	test01();

	return 0;
}

同理:引用也不可以对数组进行引用,对数组进行引用 int& d[10] = a;还是一样的技巧,从右向左看,最近的符号就是关键符号,(int&) (d[10]) = a;显然最近的符号是[10],说明这是一个数组,数组中的元素的类型是int&;也就是引用类型的; 相当于新创建一个数组d;d中的每一个元素都是int&类型的,都是引用a中的元素;但是我们知道每一个引用都是没有实体的,是不占内存的,新创建的数组中的元素每一个都是引用,那这个数组是不存在的;不可能创建一个新的数组但是这个数组中的每一个元素都是没有实体的。
但是对数组进行引用就不一样了,这是给数组起一个别名,用法跟原变量一样,是没有错误的;
对引用进行引用就不用多说了,就是脱裤子放屁没有意义。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值