c++ primer 读书笔记四

2.3.2指针
指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。
指针无须在定义是赋值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。
如果在一条语句中定义了几个指针变量,每个定义了几个指针变量,每个变量前面都必须有符号*:
int *pt1,*ip2;
double dp,*dp2;

获取对象的地址
指针存放某个对象的地址,要想获取该地址,需要取该地址符
int ival=42;
int *p=&ival;

第二条语句把p定义为一个指向int的指针,随后初始化p令其指向名为ival的int对象。因此引用不是对象。没有实际地址,所以不能定义指向引用的指针

类型要严格匹配:

double dval;
double *pd=&dval;
double *pd2=pd;

int*pi=pd;错误
pi=&dval;错误

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

利用指针访问对象
如果指针指向一个对象,则允许使用解引用符来访问对象:
int ival=42;
int *p=&ival;//p存放这变量ival的地址,或者说p是指向变量ival的指针
cout<<*p;
由符号*得到p指针所指的对象,输出为42
对指针解引用会得出所指的对象,因此如果给解引用的结果赋值,实际上也就是所给指针指的对象赋值:
*p=0;
cout<<*p;输出为0

空指针
空指针不指向任何对象,在试图使用一个指针之前代码可以首先检查是否为空,以下列出几个生成空指针的方法:
int *p1=nullptr;
int *p2=0;
int *p3=NULL;

错误的地方:
int zero=0;
pi=zero;//错误:不能把int变量直接赋给指针

赋值和指针
指针和引用都能提供对其他对象的间接访问,然而在剧吐实现细节上两者有很大不同,其中最重要的一点就是引用本身并非一个对象。一旦定义了引用,就无法再令其绑定其他对象,之后每次使用这个引用都是访问它最初绑定的那个对象。
指针和它存放的地址之间就没有这种限制了。和其他任何变量一样

指针和它存放的地址之间就没有这种限制了。和其他任何变量一样,
给指针赋值

int i=42int *pi=0//pi被初始化,但没有指向任何对象
int *pi2=&i;//pi2被初始化,存有i的地址
int *pi3;//pi3的值是无法确定的

pi3=pi2//pi2和pi3指向同一个对象i
pi2=0;现在pi2不在指向任何对象

想要搞清楚改变的是指针的值还是改变了指针所指对象的值不太容易,赋值永远改变的是等号左侧的对象

pi=&ival//pi的值被改变,现在pi指向ival
*pi=0;
则*pi发生改变

指针是0,条件取false:

int ival=1024;
int *pi=0;
int *

void*指针
void*是一种特殊的指针类型,可以存放任意对象的地址。一个void*指针存放这一个地址,这一点和其他指针类似。不同的是,我们对该地址中到底是个什么类型的对象不了解:
double obj=3.14, *pd=&obj

double obj=3.14,*pd=&obj;
void *pv=&obj;//obj可以是任意类型的对象
pv=pd//pv可以存放任意类型的指针

void*指针能做的事:拿它和别的指针比较,作为函数的输入或输出,或者赋给另一个void*指针。不能直接操作void*指针所指的对象,因为我们不知道这个对象到达是什么类型

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值