引用与指针

1.引用

引用就是对象的另一个名字,在实际的程序中,引用主要用作函数的形式参数。引用是一种复合类型,通过在变量名前添加“&”符号来定义。

复合类型是指用其他类型定义的类型。在引用的情况下,每一种引用类型都“关联到”某一其他类型。引用必须用与该引用同类型的对象初始化。当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象,不可能将引用绑定到另一个对象。

const 引用时指向const对象的引用,具体介绍参见const介绍文章。

下面是引用用法的一些例子:

int ival = 1024;

int &refVal = ival;

int &refVal2;                //错误

refVal+=2;

int i = 1024,i2 = 2048;

int &r = i,&r2 = i2;

const int ival = 1024;

const int &refVal = ival;

int &ref2 = ival;            //错误

2.指针

指针用于指向对象,保存的是另一个对象的地址。

有两种风格的声明方式,如string *str;或string* str;不能说哪种风格更好,重要的是选择一种并持续使用。

一个有效的指针必须是三种状态之一:保存一个特定对象的地址;指向某个对象后面的对象;0值。因此对指针进行初始化或赋值只能使用如下的值:

0值常量表达式;类型匹配的对象地址;同类型的另一个有效指针;另一对象之后的下一地址;

void* 指针:C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址,如下例

double pi = 3.14;

double *pd = π

void *pv = π

pv = pd;

3.指针和引用的比较

  1. 引用总是指向某个对象:定义引用时没有初始化是错误的,引用一经初始化,就始终指向同一个特定对象。
  2. 给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联,也是引用只被初用于指定同一对象导致的。如下:

int ival = 1024,ival2 = 2048;

int *pi = &ival,*pi2 = &ival2;

pi = pi2;        //pi指向了ival2

int &ri = ival,&ri2 = ival2;

ri = ri2;         //将ival2赋值给ival

4.指针中关于const的特别注意点

指向const对象的指针
不能使用void* 指针保存const对象的地址,而必须使用const void*类型的指针const对象的地址:
const int intVal = 43;
const void *cpv = &intVal;     //正确
void *pv = &intVal;                  //错误
const对象指针,允许把非const对象的地址赋给该指针,但是不允许直接修改其所指对象的值(本质上来说,由于没有办法分辨const指针所指的对象是否为const,系统会把它所指的所有对象都视为const)。看下例:
const int intVal = 43;
const void *cpv = &intVal;
int intVal2 = 42;
cpv = &intVal2;
*cpv = 24;           //错误

但是注意的是:不能保证const的指针所指对象的值一定不能改变,上例中如果修改了intVal2的值,对应的cpv指针所指的值就会改变,毕竟已经将新的intVal2地址赋给了它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值