C++Primer学习概要:引用和指针

8 篇文章 0 订阅
3 篇文章 0 订阅

引用和指针都是复合类型,是基于其他类型而定义的类型。


1. 引用(reference)

引用是对象的别名,定义时就必须指定其引用的对象,并且不能改变引用对象。也就是说一旦创建了一个引用变量,它将一直指向同一对象。

引用不是对象,因此引用本身不能再被引用,不存在引用的引用(这点和指针不同,指针是一个对象,因此存在指针的引用和指针的指针)。

int i = 1024;
int &iRef = i; //iRef是指向整数对象i的引用
int &iRef2;<span style="white-space:pre">	</span>//报错,引用必须初始化
int &iRef3 = iRef; //iRef3和iRef指向同一个对象


2. 指针(pointer)

指针是指向另外一种类型的复合类型,它本身是一个对象,一个valid的指针其内容为所指向对象的地址。与引用不同,指针可以指向不同对象(当然所指对象类型必须一样)。

int *p1, *p2; //两个空指针
int i = 22;
int *p3 = &i; //p3指向int对象i
p1 = p3; //同样指向i
p2 = &i; //同上

2.1 指针值

指针的值即指针对象内存的内容,可以为下列4种之一:

a. 一个对象的地址

b. 指向紧邻对象所占空间的下一个位置

c. 空指针(NULL)

d. 无效指针


空指针可以为如下定义中的一种:

int *p1 = nullptr; //C++11
int *p2 = 0;
int *p3 = NULL;

2.2 void指针

void*是一种特殊指针,可以存放任意对象的地址。


2.3 指针的指针(pointer to pointer)

通过*的个数可以区分指针的级别,**表示指向指针的指针,***表示指向指针的指针的指针。

int i = 22;
int *pi = &i;
int **ppi = π //指向int型指针的指针

3. 指针的引用(reference of pointer)

指针本身是对象,所以存在指向指针的引用。这里可以从右到左来解析r的含义,离r最近的是‘&’,所以首先r是一个引用,然后是‘*’,所以r是一个指向指针对象的引用,最左是int,所以r是一个指向int型指针对象的引用。

int i = 42;
int *p;
int *&r = p; //指向指针p的引用

r = &i; //令p指向i
*r = 0; //给*p,即i,赋值为0

4. const限定符

4.1 const的引用(指向const对象的引用,reference to const)

把引用绑定到常量(const)对象上,这个引用就是对const的引用。不能通过对const对象的引用修改对象的值。const的引用可以绑定到const对象也可以绑定到非const对象,但是非const的引用不能绑定到const对象上。

const int ci = 22;
const int &rci = ci; //指向const对象ci的引用
int &ri = ci; //错误,非const引用不能绑定到const对象

4.2 初始化对const的引用

对const的引用初始化时所用对象类型可以与引用类型不同,实际上初始化const的引用可以用任意表达式,只要表达式的结果可以转换成引用的类型即可。

int i = 33;
const int &cri = i; //const的引用可绑定到普通对象
const int &cr = 45; //可以绑定到常量上
const int &cr2 = cri * 2; //没问题
int &r4 = cr * 2; //错误,普通引用不能绑定到常量上

const的引用也可以用不同类型的对象初始化

double d = 2.2;
const int &ci = d; //正确,d首先被转换成int类型的常量
//上面的语句相当于
double d = 2.2;
const int temp = d; //temp == 2
const int &ci = temp; //ci绑定到这个临时的int常量上

4.3 指向const的指针(pointer to const)

与引用一样,存在指向const的指针,而且规则跟const的引用也差不多,可以指向const对象也可以指向非const对象,不能通过指向const的指针给对象赋值。普通指针(非指向const的指针)不能指向const对象。

const int i = 90;
int *pi = &i; //错误,普通指针不能指向const对象
const int *cpi = &i; //正确
*cpi = 2; //错误,不能通过指向const的指针给对象赋值

4.4 const指针

const指针是指指针本身是const的。const指针有点像普通引用,必须在声明时初始化,由于是const的,值不能变,所以只能指向同一内存位置(一般而言指向同一对象)。如果const指针不是指向的const对象,则可以通过它改变对象的值。

int i = 98;
int *const ci = &i; //必须初始化
const int *const cci = &i; //正确,这是个指向const对象的const指针
*ci = 33; //正确,可以通过const指针赋值
*cci = 45; //错误,cci是指向const对象的指针,不能通过它赋值

4.5 顶层const,底层const

指针可以指向const对象,指针本身也可以是const对象。我们用顶层const表示指针(或其他对象)本身是一个const对象,而用底层const表示指针(或引用)指向的是一个const对象。由于引用不是对象,所以不存在引用的顶层const。

简单来说,任意类型的对象都可以是顶层const,而只有指针和引用可以是底层const的。指针既可以是顶层const也可以是底层const,用于声明引用的const都是底层const。

int i = 22;
int *const cp = &i; //顶层const
const int ci = 345; //顶层const
const int *pi = &i; //底层const
const int &ri = i; //底层const
const int *const cpi = &i; //前面的是底层const,后面的是顶层const


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值