做为一种复合类型,与引用类似,指针实现了对其余对象的间接访问:指针
指针自己就是一个对象,容许对指针赋值和拷贝,并且在指针的生命周期内它能够前后指向几个不一样的对象。code
指针无须在定义时赋初值。和其余内置类型同样,在块做用域内定义的指针若是没有被初始化,也将拥有一个不肯定的值。对象
*
定义指针类型的方法将声明符写成*d
的形式,其中d
是变量名。若是在一个语句中定义了几个指针变量,每一个变量面前都必须有符号*
:生命周期
int *ip1,*ip2; double dp,*dp2;
&
指针存放某个对象的地址,要想获取该地址,须要使用取地址符(操做符&)。ip
int *ip1, *ip2; // ip1和ip2是指向int型对象的指针 double dp, *dp2; // dp2是指向double型对象的指针,dp是double型对象
在声明语句中,指针的类型实际上被用于指定它所指向的对象的类型,因此两者必须匹配。若是指针指向了一个其余类型的对象,对该对象的操做将发生错误。作用域
指针的值(即地址)应属下列4种状态之一:编译器
指向一个对象。编译
指向紧邻对象所占空间的下一个位置。基础
空指针,意味着指针没有指向任何对象。变量
无效指针,是除上述状况的其余值。试图拷贝或以其余方式访问无效指针的值都将引起错误,编译器并不负责检查此类错误。
尽管第2种和第3种形式的指针是有效的,但显然这些指针没有指向任何具体对象,因此试图访问此类指针(假定的)对象的行为不被容许。
若是指针指向了一个对象,则容许使用 解引用符(操做符*
)来访问该对象。
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; // &是声明的一部分,*是一个解引用符
在声明语句中,&
和*
用于组成复合类型;在表达式中,它们的角色又转变为运算符。
空指针(null pointer)不指向任何对象,在试图使用一个指针以前代码能够首先检查它是否为空。