C++ 指针和引用的区别
来源:互联网 发布:重庆java培训哪个靠谱 编辑:程序博客网 时间:2024/06/01 09:17
一、指针和引用的解释
指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作,下面简单解释一下指针和引用的区别
指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址。
char c=‘A';
char *p=&c;
指针p指向char类型的变量C 。P的值为:&C,即变量C的地址
引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。
int i=1;
int r=&i;
此时r和i指向同一个int类型的对象,对r的操作就是对i的操作。既然是别名,必然是引用一个已经存在的对象,引用不允许为空。故定义一个引用的时候,必须初始化。
二、指针与引用的区别
1. 声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必。这也就是引用的比指针效率高的原因:
void printDouble(const double& rd){cout << rd; // 不需要测试rd,它肯定指向一个个double值}
而使用指针必须进行判空操作:
void printDouble(const double *pd){if (pd) { // 检查是否为NULLcout << *pd;}}
2. 指针与引用的另一个区别:引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容: int i=10; int j=5; int& ref=i; ref++; cout<<"i="<<i<<endl; //i=11 cout<<"ref="<<ref<<endl; //ref=11 ref=j; ref++; cout<<"i="<<i<<endl; //i=6 cout<<"ref="<<ref<<endl; //ref=6
3. 常量指针和常量引用
常量指针:指向常量的指针,在指针定义语句的类型前加const,表示指向的对象是常量。即:“常量指针”所指向的地址上的数据是常量。
int i=10;const int *pointer=&i; //p就是一个常量指针*pointer=20 //这是不允许的
常量引用:指向常量的引用,在引用定义语句的类型前加const,表示指向的对象是常量。也跟指针一样不能利用引用对指向的变量进行重新赋值操作。4. 指针常量与引用常量
指针常量:指这个指针本身是一个常量,所指向的地址是常量,地址上面的数据是可以变化的。在定义指针常量时必须初始化!对于引用来说,这是天生具来的属性,不用再在定义语句的引用名前加const。
int i=10;char c='A';int *const pointer =&i; //pointer是一个指针常量,始终指向&i;pointer=&c ; //错误,不能改变它的指向*pointer='B'; //正确,所指向地址上的数据可以改变
总结:
指针常量的申明:const 放在* 和指针名之间 Type * const pointer ;
常量指针的申明:const放在类型说明符之前 const Type *pointer ;
总结:指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。
参考资料:
http://blog.csdn.net/ostrich_cn/article/details/2295196
http://dev.yesky.com/495/2567995.shtml
http://www.cnblogs.com/skynet/archive/2010/09/22/1832911.html
- 【C/C++】引用和指针的区别
- 指针和引用的区别(C++)
- C程序设计语言--指针和引用的区别
- 引用和指针的区别C/C++
- [C++]指针和引用的区别
- C++:指针和引用的区别
- 【C++】指针&引用的区别
- 【C/C++】概念:指针和引用的区别
- c++引用类型和指针类型的区别
- 【C/C++学习】之一、指针和引用的区别
- JAVA 引用和C语言指针的区别
- 指针和引用的区别
- 指针和引用的区别
- 指针和引用的区别
- 指针和引用的区别
- 指针和引用的区别
- 指针和引用的区别
- 指针和引用的区别
- 6.11 程序锁耗电优化
- poj1061 青蛙的约会 扩展欧几里德的应用
- 找工作随想
- 【菜鸟翻译】Creating an Android Project
- boost mpi 简单例子测试
- C++ 指针和引用的区别
- 6.12 进一步优化看门狗 内容观察者观察数据库变化
- ubuntu gedit出错:Failed to connect to the session manager
- [Shader 着色器] 学习前了解知识
- Lotus 迁移到Exchange 之 利用Transport 同步AD和Domino 目录!
- OpenSSL命令---CMS
- Demo:把文件内容读入一个String
- linux 正则表达式
- 让一个影片在某一帧停几秒钟再继续播放