引用:
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》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
本文深入解析C++中引用和指针的区别与特性,包括引用的初始化、类型适配、字面值绑定限制,以及指针的地址操作、类型一致性、void型指针用途等关键概念。
1115

被折叠的 条评论
为什么被折叠?



