C++知识点2——指针、引用基础

本文深入解析C++中引用和指针的区别与特性,包括引用的初始化、类型适配、字面值绑定限制,以及指针的地址操作、类型一致性、void型指针用途等关键概念。

引用:

1.引用就是对象或变量的别名,但引用不是对象或变量

int a=10; int &b=a;

这里面,b就是变量a的另一个名字,对b操作就是对a操作,对a操作,b也会变化

void testreference()
{
	int a=10;
	int &b=a;
	b=5;
	cout<<a<<b<<endl;
	a=4;
	cout<<a<<b<<endl;
}

 

2.因为引用一定是某个变量的别名,引用一定是和变量绑定在一起的,所以引用必须初始化

int a=10;
int &b;

 

3.因为引用不是对象,但是引用又要绑定一个对象,所以不能定义引用的引用

int a=10;
int &b=a;
int &(&c)=a;

 

4.因为操作引用就是操作变量或者对象本身,所以对于内置类型,变量和其引用之间的类型要适配

int a=10;
float &b=a;

 

5.因为引用必须和变量进行绑定,所以非const引用不能绑定字面值

int a=10;
int &b=20;

 

所以,引用的基本特性就五个:1.不是对象,2.必须初始化,3.不能定义引用的引用,4.类型适配,5.不能绑定字面值

 

指针

6.指针就是变量的地址,可以通过引用访问变量,也可以通过指针访问变量,但是指针是对象,而引用不是,这是二者的根本区别

void testpointer()
{
	int a=10;
	int *p=&a;
	int *q;
	cout<<p<<endl<<q<<endl;
}

通过上述代码,可以知道,指针可以不初始化(只是为了演示,不要这样做),但是引用必须初始化

另外,&符号既能表示引用,也是取地址符号,当&出现在=左侧时,是引用,在=右边就是取地址

 

7.因为指针是一个对象,所以可以定义指针的指针,但是不能定义引用的引用

void testpointer()
{
	int a=10;;
	int *p=&a;
	int *q;
	int **pp = &p;
	cout<<p<<endl<<q<<endl;
	cout<<pp<<endl;
}

所以,指针的引用的不同点就是:1.引用必须初始化,指针不用,2.可以定义指针的指针,但是不能定义引用的引用,这两点的原因就是指针是变量,而引用不是(只是个别名)

 

8.指针所指向的数据的类型要和指针的类型一致

float a=10;
int *p=&a;

 

9.指针的引用

因为指针是对象,引用不是,所以可以定义指针的引用,但是不能定义引用的指针

void testpr()
{
	int i=0;
	int *pi=&i;
	int *&pr=pi;
	cout<<pr<<endl<<pi<<endl;
	*pr=4;
	cout<<i<<endl;
}

int *&pr=pi;说明了如何定义一个指针的引用,可以从右向左读,

先看红色部分,我们知道有个对象叫pr,接着看到蓝色的&,我们知道pr是一个引用,

最后看到int *,就知道这个引用和一个int类型的指针绑定,这是指针就是pi

因为pr是pi的别名,所以对可以通过pr改变i

 

10.void 型指针

void型指针可以存放任意类型的指针(包括二级指针),但是不能对void型指针解引用,所以void*指针可以保护数据所在的内存不被修改

void testvoidp()
{
	double d=1.2;
	double *pd=&d;
	int i=11;
	int *pi=&i;
	void *vp=pi;
	vp=pd;
	cout<<__func__<<endl;
	cout<<*vp;
}

 

参考:

《C++ Primer》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值