赞
踩
引用:
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》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。