C++ Primer-第二章-笔记

第二章 变量和基础

2.3 复合类型

2.3.1 引用

2.3.2 指针

做为一种复合类型,与引用类似,指针实现了对其余对象的间接访问:指针

  • 指针自己就是一个对象,容许对指针赋值和拷贝,并且在指针的生命周期内它能够前后指向几个不一样的对象。code

  • 指针无须在定义时赋初值。和其余内置类型同样,在块做用域内定义的指针若是没有被初始化,也将拥有一个不肯定的值。对象

2.3.2.1 定义指针类型*

定义指针类型的方法将声明符写成*d的形式,其中d是变量名。若是在一个语句中定义了几个指针变量,每一个变量面前都必须有符号*生命周期

int *ip1,*ip2;     
double dp,*dp2;

2.3.2.2 获取对象的地址&

指针存放某个对象的地址,要想获取该地址,须要使用取地址符(操做符&)ip

int *ip1, *ip2;    // ip1和ip2是指向int型对象的指针
double dp, *dp2;    // dp2是指向double型对象的指针,dp是double型对象

在声明语句中,指针的类型实际上被用于指定它所指向的对象的类型,因此两者必须匹配。若是指针指向了一个其余类型的对象,对该对象的操做将发生错误。作用域

2.3.2.3指针值

指针的值(即地址)应属下列4种状态之一:编译器

  1. 指向一个对象。编译

  2. 指向紧邻对象所占空间的下一个位置。基础

  3. 空指针,意味着指针没有指向任何对象。变量

  4. 无效指针,是除上述状况的其余值。试图拷贝或以其余方式访问无效指针的值都将引起错误,编译器并不负责检查此类错误。

尽管第2种和第3种形式的指针是有效的,但显然这些指针没有指向任何具体对象,因此试图访问此类指针(假定的)对象的行为不被容许。

2.3.2.4 利用指针访问对象

若是指针指向了一个对象,则容许使用 解引用符(操做符*)来访问该对象。

int ival = 42;
int *p = &ival;    // p存放着变量ival的地址,或者说p是指向变量ival的指针
cout << *p;

对指针解引用会得出所指的对象,所以若是给解引用的结果赋值,实际上也就是给指针所指的对象赋值:

*p = 0;
cout << * p

【注意】解引用操做仅适用于那些确实指向了某个对象的有效指针。

&*,既能做表达式里的运算符,也能做为声明的一部分出现,符号的上下文决定了符号的意义:

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

在声明语句中,&*用于组成复合类型;在表达式中,它们的角色又转变为运算符。

2.3.2.5 空指针

空指针(null pointer)不指向任何对象,在试图使用一个指针以前代码能够首先检查它是否为空。

相关文章
相关标签/搜索