重学c++ primer(5)
指针:
指针是存放某个对象的地址,要想获取该地址。需要使用取地址符(&)。比如:
int ival=42;
int *p=&ival;
第一条语句定义并初始化了整型变量ival为42,第二条语句把p定义为指向int的指针。随后初始化p令其指向名为ival的int对象。另外。由于引用不是对象。没有实际地址。所以不能定义引用的指针。在定义并初始化指针时,一定要注意指针的类型与其所指向的对象的类型要严格匹配。例如:
double dval;
double *pd=&dval;
double *pd2=pd;
上述三条语句是正确定义。因为类型对应一致。定义正确。再看下面两条:
int *pi=pd;
pi=&dval;
有明显错误,第一条指针pi‘的类型与pd不匹配。第二条试图把double型赋给int,这是绝对不容许的。所以注意。指针的类型用于指定它所指向对象的类型。所以必须保证一致。
指针值:
所说的指针的值实际上是地址。一般来说指针的值为下列4种之一:
1.指向一个对象。
2.指向紧邻对象所占空间的下一个位置
3.空指针、
4.无效指针。
利用指针访问对象:
如果一个指针指向了一个对象,则容许使用解引用符,来访问该对象。
比如:
int ival=42;
int *p=&ival;
cout<<*p;
来看第二条语句。p存放着变量ival的地址。注意下一个语句,由解引用符*来得到p的对象,输出42;
对指针解引用会得到它所指向的对象,所以如果给解引用的结果赋值,实际上是给指针所指向的对象赋值。比如
*p=0;
cout<<*p;
顺便说一下空指针,它是不指向任何对象的指针,在c++11特性中,可以用nullptr来初始化。
赋值与指针:
首先是指针和引用的区别。这个很容易搞混。引用本身并非一个对象,一定定义了引用,就无法令其在绑定其他对象。以后再使用这个引用都是访问他所绑定的对象。而指针就没这么多要求,它和其他变量一样。可以给指针赋值。从而指向一个新的对象。
再来看看void*指针。其实它是一个特殊的指针类型,可以存储任何对象的地址。一个void*指针存放一个地址。比如
double obj=3.14,*pd=&obj;
void *pv=&obj;
pv=pd;
pv是void类型的指针,所以pv可以存放任何对象的地址。
下面说二级指针。
**表示指针的指针,比如
int val=1024;
int *pi=&val;
int **ppi=&pi
此处pi指向int的指针,ppi指向int型指针的指针。下面的图可以概括:
指向指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象。所以存在对指针的引用。比如
int i=42;
int *p;
int *&r=p;
r=&i;
*r=0;
第二条语句是指p是一个int型指针,接下来r是一个对p的引用。然后是r引用一个指针。最后解引用r得到i。