日拱一卒之C++基础一 指针与引用基本概念
来源:互联网 发布:国内支持mac的网游 编辑:程序博客网 时间:2024/05/22 05:08
引用,一个变量的别名,为什么引入别名呢?原因是我们想定义一个变量,他共享另一个变量的内存空间,使用别名无疑是一个好的选择。变量是什么?是一个内存空间的名字,如果我们给这个内存空间在起另外一个名字,那就是能够共享这个内存了,引用(别名)由此而来。
指针,指向另一个内存空间的变量,我们可以通过它来索引另一个内存空间的内容,本身有自己的内存空间。
二者区别:
1.引用访问一个变量是直接访问,而指针是间接访问。
2.引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
3.引用在开始的时候就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值.引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
4.引用不可以为空,但指针可以为空。
5.引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有的,前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
6.sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
7.指针和引用的自增(++)运算意义不一样;
8.引用是类型安全的,而指针不是 (引用比指针多了类型检查)
例如:
int i = 3,j = 4;
int &x = i;//成为i的别名
x = j;//不能否认x仍然引用i,并没有成为j的别名,只是修改了x和j共享的内存空间的值.这点与指针不同,指针在任何时刻都可以改变自己的指向
总之:指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。
从某种意义上来说,引用类似 int* const p 这样的const指针(并非如 const int* p这样的指向常量的指针)。不管有多么类似,请不要混淆引用和指针;它们完全不同。
何时该使用引用, 何时该使用指针?
尽可能使用引用,不得已时使用指针。引用不可以为空,但指针可以为空。引用是对象的别名,引用为空,对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,你的设计不允许变量为空,这时你应该使用引用。
PS:有一个规则可以很好的区分const是修饰指针,还是修饰指针指向的数据——画一条垂直穿过指针声明的星号(*),如果const出现在线的左边,指针指向的数据为常量;如果const出现在右边,指针本身为常量。而引用本身与天俱来就是常量,即不可以改变指向。
在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:
传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。
所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现
两整数变量值交换的c程序如下:
void swap(int *a,int *b)//指针传递参数
{
int temp;
temp=*a;
a=*b;
*b=temp;
}
使用引用机制后,以上程序的c++版本为:
void swap(int &a,int &b)//引用传递参数
int temp;
temp=a;
a=b;
b=temp;
}
调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
- 日拱一卒之C++基础一 指针与引用基本概念
- 【每日一C之十二】指针与引用的区别
- c语言基础之指针与一维数组
- C与C++之引用与指针
- c,c++易错点之指针与引用
- c语言指针初探 一指针与引用
- c语言指针初探 一 指针与引用(二)
- 【c++】指针与引用
- 【C++】指针与引用
- C++【引用与指针】
- 指针与引用c
- 【C++】指针与引用
- 【C++自我精讲】基础系列一 指针与引用
- [More Effective C++]条款一:指针与引用的区别
- c语言基础之指针与函数
- C语言基础之指针与数组
- C语言基础与提高之指针
- C++基础之:引用与指针的区别
- wpf 后台绑定数据 binding
- 关于答辩问题收集
- ajax的定时调用
- Jersey – RESTful service
- OpenGL ES VBO 和 VAO
- 日拱一卒之C++基础一 指针与引用基本概念
- Oracle Job的创建方法(不积跬步,无以至千里)
- [LeetCode] Palindrome Number
- java web中的session属性范围和request属性范围
- Linux上安装icescrum
- asmca命令行
- PHP错误Can't use method return value in write context
- 在centos上安装MongDB
- 51系列小型操作系统精髓 简单实现12 C语言版未加保护参数