指针与引用使用总结
来源:互联网 发布:2016零售业数据分析 编辑:程序博客网 时间:2024/06/06 17:41
一、指针
1.指针的删除
(1)删除指针后,要将指针赋为空
使用空指针是非法的,容易使程序崩溃
把指针赋为空是为了方便检查出错误
(2)类的析构函数中,删除指针后,指针可以不清零。因为对象消失后,对象的成员指针就成为无法访问的指针
(3)this指针记录的是当前对象的地址。
this指针的创建与删除由编译器完成
2.指针的加减
对指针进行加减运算时,根据指针指向的类型,内存的地址会相应的改变class A{int x;};int main(){A *p = new A;cout<<p;p++;cout<<' '<<p<<endl;int *q = new int;cout<<q;q++;cout<<' '<<q<<endl;double *w = new double;cout<<w;w++;cout<<' '<<w<<endl;return 0;}
输出:
00741DF8 00741DFC //类A的一个对象所占的空间是4B
00741E68 00741E6C //一个int型变量4B
00740848 00740850 //一个double型变量所占空间是2B??????????????????
3.几个与常量相结合的指针
名称表达方式指针所保存的地址指针指向的内容常量指针int *const p;不可变可变指向常量的指针const int *p;可变不可变指向常量的常指针const int *const p;不可变不可变二、引用
1.引用就是别名,如int &rnum = num;
例1:
int main(){int a;int &ra = a;ra = 999;cout<<"a:"<<a<<endl;a = 0;cout<<"ra:"<<ra<<endl;cout<<&a<<' '<<&ra<<endl;return 0;}
输出:
a:999 //改变ra会导致a做同样的改变
ra:0 //改变a会导致ra做同样的改变
0012FF44 0012FF44 //ra和a具有相同的地址
1)ra是a的别名,可以说ra就是a
2)L4和L9中的&ra意义不同。
L4:说明ra是一个引用
L9:对ra取地址
2.可以定义一个对象的别名,但不能定义一个类的别名,因为类没有地址
3.定义引用时一定要同时对该引用初始化。引用如同常量,只能初始化,不能赋值。
例:
int main(){int a;int &ra = a;//正确int b;int &rb;rb = b;//错误return 0;}4.int *p, *q; //p和q都是指针int *p,q; //p是指针,q是变量
三、指针与引用
1.指针与引用的区间
(1)指针是间接访问,因为要用*来读取地址处的数据。将指针作为函数的接收参数是间接引用的方式
引用是直接访问,因为引用是别名,不用任何符号就可以直接读取该对象的数据。将别名作为函数的接收参数是直接引用
(2)
指针
引用
是否可以为空
可以
不可以
是否可以初始化
可以
可以
是否可以赋值
可以
不可以
是否可以访问堆
可以
不可以
不否可以改变对象
可以改变指向的对象,可以改变对象的值
不可以改变引用的对象,可以改变对象的值
2.指针与引用单独使用的举例
(1)例1:int &r = new int; //错误,不可以直接引用来指向堆中空间
(2)例2:
int *p = new int; int &r = *p; //正确,r是通过指针p读取到的未命名int型变量的别名 r = 4; cout << *p ; //输出4
(3)例3:int *&r = new int; //正确
创建一个堆中空间,定义r来作为该空间地址的引用,这样r就成了该空间地址的别名。由于引用不能作为指针来使用,所以在&r前面加个*。这样,r变成了一个指针变量,它保存的是堆中空间的地址。所以用*来访问r,*r就是访问堆中数据。用*来读取r地址处的值,*&r就是读取堆中的地址。
3.指针与引用单独使用的举例
int main(){/*如果int申请失败->返回空指针->产生一个无用的引用引用不能为空,用*读取一个无用的引用会引用系统崩溃*/int *&r = new int;*r = 6;/*r是new int的别名,也是新空间地址的别名,用*来访问r,就是读取新空间中保存的数据*/cout<<"读取新空间的地址处的值"<<*r<<endl;/*r的值是新空间的地址*/cout<<"输出新空间的地址"<<r<<endl;/*用*r读取r的地址保存的值,则先用&取地址,再用*读取该地址的值*/cout<<"读取r地址处的值"<<*&r<<endl;/*r也有自身的地址*/cout<<"输出r的内存地址"<<&r<<endl;return 0;}
输出:
读取新空间的地址处的值6
输出新空间的地址006A1DF8
输出r的内存地址0012FF40
- 指针与引用使用总结
- 引用与指针的区别总结
- 引用、指针与const修饰符总结
- 指针:指针与引用
- 第六章善于使用指针与引用
- C++ 指针与引用的使用
- C++指针与引用(三):引用使用注意事项
- 关于new/delete 与free/malloc,指针与引用 总结
- 总结:指针、引用、const
- 引用与指针有何区别?何时只能使用指针不能使用引用?
- C++中引用传递与指针传递总结
- paip.指针 引用 c++ java的使用总结.
- 指针与指针的引用
- 指针与指针的引用
- 指针与指针的引用-
- 指针与指针的引用
- 指针与二维指针、引用
- 指针与引用
- initwithcoder initwithframe initWithNibName awakeFromNib initWithCoder
- 基于ATL的智能卡中间件的实现
- C语言错误处理——setjmp & longjmp
- hdu 1196
- 四极管:区电子设计大赛 之 STM32简易绘图仪
- 指针与引用使用总结
- 幸福了吗
- 20120114雨,杭州
- VB工程7---百例1 改编
- vsftpd
- 笑死我了,看了第一个哥没能hold住
- Shell学习笔记-基本点
- Linux-world-2012-January->8.2 (minicom配置)
- 上传文件问题