C学习目标最简单实用的指针类型介绍

白癜风诊疗目标 http://m.360xh.com/202007/22/58972.html

本目标介绍的指针类型(pointer)在CC++中可谓大名鼎鼎,它用于保存另一个数据对象的地址。它最实用的用法是指向一个复杂的数据结构,或管理在程序运行过程中动态分配的对象。它也经常用作函数参数或返回值,用于减少程序内存开销和拷贝次数。如VS库文件“afxwin.h”里的代码就大量存在它的身影:

每个指针都有一个相关的数据类型,需通过在变量名前加一个解引用操作符(*)来定义指针(注意,*和变量名之间可以有空格),如:

int*pnValue=nullptr;

double*pdValue=nullptr;

建议不要将指针和非指针变量写在一行来定义,这样阅读起来比较麻烦,也容易产生混淆。

指针变量定义时记得要初始化。nullptr是C++11引入支持的空指针关键字,可以理解为以前常用的NULL或0。

C++PrimerPlus第6版中文版(异步图书出品)京东月销量好评率98%无理由退换京东配送官方店¥94.4购买

不同数据类型的指针本质上的相同点是,保存相同大小的内存地址(32位程序占4个字节、64位程序占8个字节)。不同点是,编译器默认会按指针定义的类型来解释其地址指向内容的数据格式,即int*指针编译器会认为其指向一个int。

除了赋空指针外,指针指向变量的赋值操作借助于取地址符()来进行。如:

int*pnValue=nValue;

那如何访问指针指向的对象呢?答案是使用解引用操作符(*)。如:

*pnValue=3;

写一个简单的示例程序:

运行一下(Ctrl+F5)看看输出:

注意:空指针是不能直接解引用的。如果将以上例子修改下:

[what]运行起来结果会怎么样?答案是在VS下解引用空指针,直接运行会导致程序异常崩溃。如果是在调试模式下(Debug)则会弹出一个“发生访问冲突”对话框如下:

[what]那为什么编译器不在编译阶段报错呢?因为目前编译器的能力也是有限的,这也是很多人指出指针要谨慎使用的原因之一。但也请不要有压力,目前市场上有代码静态检查工具可检测到解引用空指针错误,在提交测试发布前经静态工具扫描确认是很多软件企业的自动部署集成的必要流程。

C++PrimerPlus第6版中文版c++编程入门京东¥购买已下架

指针本身可用于比较,两个指针比较的逻辑含义是判断是否指向同一个地址。当然,比较的结果是相等或不相等,大于和小于是没有意义的。

还有一个特殊类型的指针:空类型指针void*,表明该值是个地址,但该地址的对象类型是未知的。空类型指针其指向的对象不能直接被操作,但该地址可被传输或与其他地址值比较。在作为编写模块接口或回调函数时,该类型比较常用。如VS库文件“afxwin.h”里的代码:

指针还有一种比较特别的用法,它可以有算术运算,即增加或减少一个整数值。指针运算的实质是将指针的内存地址偏移到其前面或后面的其它内存地址上,偏移的字节量与指针的类型相关,如int指针增加或减少1即将内存地址偏移4个字节。这是一种很危险极度不推荐的用法,一般在比较底层讲究运行效率的代码里存在。

总体而言,指针的用法还是比较复杂的,但学CC++就无法避免与它打交道,学好它是很有必要的。

学习目标“最简单实用的指针类型介绍”已完成[再见]




转载请注明:http://www.aierlanlan.com/rzdk/2447.html

  • 上一篇文章:
  •   
  • 下一篇文章: