欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2.3复合类型---指针

程序员文章站 2024-03-07 16:15:33
...

2.3.2指针

指针是”指向“另外一种类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。但两者有很多不同:1.指针本身是一个对象,允许对指针复制和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象;2.指针无须在定义时赋初值和其他内置类型一样,在块作用域内定义的指针如果没有初始化,也将有一个不确定的值。

指针的定义
如在一条语句中定义了几个指针变量,每个变量前面都必须有符号*

int *p1,*p2;//都是指向int型对象的指针
double dp,*dp2;//dp是double型对象,dp2是指向double型对象的指针

获取对象的地址
使用取地址符(&)

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

因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。
同引用一样,除p56p534两种例外情况,所以指针类型都要和他所指向的对象类型严格匹配。

指针值应属下列四状态之一
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置(注:不可访问,否则后果无法预计
3.空指针,意味着指针没有指向任何对象(注:可定义,但不可访问,否则会出现意想不到的错误
4.无效指针,除上述情况之外的

利用指针访问对象
使用解引用符(*)

int ival=42;
int *p=&ival;
cout<<*P; //由解引用符号得到指针p所指向的对象,输出42
*p=0;//给解引用的结果赋值,实际上也就是给指针所指向的对象赋值
cout<<*P; //由解引用符号得到指针p所指向的对象,输出0

对指针解引用会得到所指的对象,同样如果给解引用的结果赋值,实际上也就是给指针所指向的对象赋值。
解引用操作符仅适用于那些确实指向了某个对象的有效指针。

空指针
不指向任何对象,使用指针前可先检查是否为空。

int *p1=nullptr;//C++11新特性,等价于int *p1=0;
int *p2=0;//地址为0000000,而不是整型数值0
int *p3=NULL;//NULL为预处理变量,使用时预处理器会自动将它替换为实际值
int zero=0;
int *pi=zero;//错误!把int变量直接赋给指针是错误的操作

1.新标准下最好使用字面值nullptr,同时尽量避免使用NULL
2.#2句赋值0,是地址为0,而不是int型的0,把int变量直接赋给指针是错误的操作,这是编译器预留的特殊用途地址;

建议:初始化所有指针,并且在可能的情况下,尽量等定义了对象之后在定义指向它的指针。

给指针赋值就是令他存放一个新的地址,从而指向一个新的对象;但仍要注意类型的一致性。

**任何非0指针对应的条件值都是true

void 指针
void*指针可以存放任意对象的地址,当我们不确定类型时,常用void定义,但无法访问内存空间中所存的对象。