复合类型 —— 指针

指针

指针是“指向(point to)”另外一种类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。

指针与引用的不同点:
  1. 指针本身就是一个对象,允许对指针赋值和拷贝,且在指针的生命周期内它可以先后指向几个不同的对象。
  2. 指针无需再定义时赋初值。与其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。

int *ip1, *ip2;
ip1 和 ip2 都是指向 int型 对象的指针
double dp, *dp2;
dp2 是指向 double型 的指针,dp 则是一个 double型 常量

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

第二条语句把p定义为一个指向int的指针,随后初始化p另其指向名为ival的int对象。

除了两种例外情况外,其他所有指针的类型都要和它所指向的对象严格匹配。

指针值

指针的值(地址)应属下列四种状态之一:

  1. 指向一个对象。
  2. 指向紧邻对象所占空间的下一个位置。
  3. 空指针,意味着指针没有指向任何对象。
  4. 无效指针,也就是上述情况之外的其他值。
利用指针访问对象

如果指针指向一个对象,则允许使用解引用符(操作符*)来访问对象。

int ival = 42;
int *p = &ival;
cout << *p;
得到p所指的对象,输出42

空指针

空指针不指向任何对象,在试图使用一个指针之前代码可以首先检查它是否为空。

int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;
这三种声明的方法都是等价的,都将指针设置为空

赋值和指针

指针和引用都提供对其他对象的间接访问,最大的不同是引用本身并非一个对象。一旦引用了,就无法令其再绑定到另外的对象,之后每次使用这个引用都是访问他最初绑定的那个对象。指针则没有这中限制。

int i = 42;
int *p1 = 0;
int *p2 = &i;
int *p3;
int p3 = p2;
p1 为空,p2 与 p3 是指向int型变量的指针(或 p2 与 p3 存放i的地址)

赋值永远改变的是等号左侧的对象。

pi = &ival;
pi的值被改为指向ival
*pi = 2;
pi所指的对象ival的值被改为2,pi指针并没有改变

void* 指针

void*是一种特殊的指针类型,可用于存放任意对象的地址。

double obj = 3.14, *pd = &obj;
void *pv = &obj;
pv = pd;
void 声明的指针可以存放任意对象的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值