《c++ primer》第二章 引用与指针

引用,指针

1.引用(reference)

当我们使用术语“引用”时,我们所指的一般是左值引用。引用是对象的另一个名字。一般初始化变量时,初始值将被拷贝到新建对象中。但是定义引用时,程序会将它和初始值绑定在一起,而不是将初始值拷贝给它。除了两种情况外,其余情况下引用的类型要严格匹配其对象类型。

2.指针(pointer)

指针本身就是一个对象,允许对指针赋值和拷贝。指针无需在定义时赋初值。

指针存放某个对象的地址,想要获取改地址,需要使用取地址符(操作符&)。

int ival=42;
int *p=&ival;//声明指针写成*p的形式。

除了两种情况外,指针类型都要与它所指的对象类型严格匹配。

第一种情况是,在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能够转换成为引用类型即可。

如果指针指向了一个对象,则允许用解引用符(操作符*)指向该对象。

int ival=42;
int *p=&ival;//p存放着对象ival的地址,也就是说p是指向ival的指针
*p=0;//使用解引用符访问该对象,将ival的值修改为0。

像&和*这样的符号,既可以所谓运算符,也可以作为声明的一部分出现。

int i=42;
int &r=i;//&紧随类型名出现,是声明的一部分,r是一个引用。
int *p;//*紧随类型名出现,是声明的一部分,p是一个指针。
p=&i;//&在表达式中出现是一个取地址符。
*p=i;//*在表达式中出现,是一个解引用符。

3.空指针

空指针不指向任何对象。生成空指针的方法如下,最常用的是nullptr;

int *p1=NULL;
int *p2=0;
int *p3=nullptr;

4.void*指针

void*是一种特殊指针类型,它可以存放任何类型的地址。但我们不能直接操作void*类型的指针,因为不知道它是什么类型。为了确保转换后的类型是指针所指的类型,我们使用static_cast函数。 

void *p=&d;
double *dp=static_cast<double*>(p);

5.指向指针的引用

引用不是一个对象,因此不能够定义指向引用的指针;但是指针是一个对象,因此可以定义指向指针的引用。

int i=42;
int *p;//定义p是一个指针
int *&r=p;//定义r是指针p的一个引用。即r是p的别名。
r=&i;//r指向i的地址,即p指向i得地址。
*r=0;//使用r将i的值修改为0。
//面对一个比较复杂的指针或者引用的语句的时候,从右向左阅读有助于弄清楚含义。

猜你喜欢

转载自blog.csdn.net/eriHanami/article/details/82709464