变量名和地址
变量名是指内存空间的名字(好比人的名字),地址是指内存空间的编号(好比人的身份证号码),通过变量名或者地址都能获取这块内存空间的内容(就好比通过名字或者身份证都能找到这个人)。
指针
指针就像是其他变量一样,那为什么不直接叫变量呢?与变量不同的是,指针存储的不是真实内容,而是要访问内容的地址。
int a = 10;
int *p = &a; //这就定义了一个指向变量a的指针p
引用
引用是某一个变量或对象的别名(好比人的绰号,不管有多少个绰号,指的都是同一个人)。
看看它的语法定义格式:类型 &引用名 = 目标变量名。
int a = 10;
int &bn = a; //访问bn实际上就是访问a,都为10
/*
*注意bn和a的内存空间地址都一样,意思就是说声明引用时并没有分配
*新 的内存空间,它只是拿了变量a的地址来用,所以知道为什么叫引用
*了吧
*/
解引用
解引用就是取内存地址里的具体值,例如:
int a = 10;
int *p = &a;
*p; //得到的是变量a的值。
相信比较多人有点乱了,取地址和引用都是用&符号,定义指针变量和解引用都是用*符号,那么怎么区分呢?
可以看出等号右边用&表示的是取地址,等号左边用&表示的是引用的定义;等号右边用表示的是解引用,等号左边用表示的是指针变量的定义
好了,有没有明白过来,了解了概念之后,下面我们通过程序来强化。
示例
int x = 5;
int *ptr = &x;
*ptr;
/*
*ptr是指针变量,它的内容就是x变量的地址,我要怎么拿到这个5
*呢,*ptr就是取x变量地址的内容,这就叫做解引用
*/
引用是一个指向其它对象的常量指针,它保存着所指对象的存储地址。并且使用的时候会自动解引用,而不需要像使用指针一样显式提示。所以:
int a = 10;
int &bn = a;
/*
*不管你用变量名a还是bn都是指变量a的内存空间(好比一个人除了有名
*字,也可以有绰号,但不管怎么样都是指这个人)
*/
C++创建对象时返回的是对象地址,要用指针来接收,例如:
Demo *demo = new Demo();
能不能像java这样Demo demo = new Demo(),然后使用demo.属性名呢;这个时候就要使用引用了,例如:
Demo &demo = new Demo();
总结
指针和引用的区别
- 指针有自己的一块空间,而引用只是一个别名;
- 使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;
- 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象;
- 可以有const指针,但是没有const引用;
- 指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变;
- 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象;
- 可以有const指针,但是没有const引用;
- 指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变;
- 指针可以有多级指针(**p),而引用至于一级;
- 指针和引用使用++运算符的意义不一样;
- 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。