2.3.3理解复合类型的声明
两种声明定义方法
1.int* p1,p2;
2.int *p1,p2;
两种方法均合法,只是侧重点不同,第一种着重强调变量具有的复合类型;第二种侧重于强调本次声明定义了一种复合类型。自己选择并坚持一种写法即可,最好不要变来变去。
一般说来,声明符中修饰符(&,*)的个数没有限制。当多个修饰符连写在一起时,按照其逻辑关系解释即可。下面将介绍一种特殊的指针和引用。
指向指针的指针
指针是内存中的对象,像其他对象一样也有自己的地址,因此允许把指针的地址在存放到另一个指针中。如**表示指向指针的指针,***表示指向指针的指针的指针。有点绕人,自己好好理解下,把握住本质就好。指针里存放的是另一个指针的地址
int ival=1024;
int *pi=&ival;//pi指向一个int型的数
int **ppi=π//ppi指向一个int型的指针
//通过*解引用访问指针的指向对象的内容
cout<<ival<<endl;//1024 直接访问
cout<<*p<<endl;//1024 通过指针间接访问
cout<<**ppi<<endl;//1024 通过指向指针的指针两级间接访问
cout<*ppi<<endl;//此时是指针p的地址
小窍门:当想访问到原对象时,声明中有几个取地址符&,访问原对象内容时就需要添加几个解引用符*。
指向指针的引用
我们反复强调了,引用本身不是一个对象,因此不能定义指向引用的指针。但指针所对象,所以存在对指针的引用,即给一个指针取了一个“外号”。
int i=42;
int *p;//此时已经创建内存空间
int *&r=p;//r是一个对指向int型指针p的引用,要把r看作指针使用
r=&i;////r引用了指针p,因此给r赋值&i,就是另p指向i
*r=0;//*r=0等价于*p=0,即将指针指向的对象i赋值为0i
tips
面对一个复杂的声明语句时,从右往左阅读有助于能清真实含义,离变量名最近的符号对变量的类型有最直接的影响。