- 1、本文档共42页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 指针、引用与数组 4.1 指针 关于内存地址 内存空间的访问方式 通过变量名访问 通过地址访问 指针是内存地址与存储数据的类型相结合的产物。利用指针可以使程序绕过普通变量名读取或修改内存中存储的值。 有利于增强语言的能力和提高程序的效率 但使用错误的地址也会导致不可预测的后果 4.1.1 指针的概念 1 变量的地址 例如:定义变量 int x(10); 假定程序运行时为x分配的内存空间的首地址(第一个字节的地址)是0x12ff88,则可以认为0x12ff88是一个指向x的指针。 称为取地址运算符,表达式x就是x的地址,或者说指向变量x的指针。 通常,程序中只使用x来表示x的地址,并不需要知道x的实际值是多少。 首先,在程序的两次运行时,分配给x的地址可能并不一致。 其次,表达式x中除了数值0x12ff88之外,还含有此地址所指向的内存中所保存数据的类型信息。 4.1.1 指针的概念(续) 2 指针变量 4.1.1 指针的概念(续) 指针反映出两方面的含义 其一是指针的值,即指针指向内存的位置。 其二是利用该指针可以从内存中取出一个什么样的数据,指针类型“type*”中的type恰好说明了这种数据的类型。 由于type决定了通过指针取得的数据类型是否正确,通常称其为指针的“基类型”。 4.1.1 指针的概念(续) 例如,对于如下变量: int x(10); double y(2.3); 利用指针变量可以保存指针的值,如图: int x =10, *px = x; double y =2.3, *py = y; 4.1.1 指针的概念(续) 注意: 指针间的赋值应严格保证其类型相同。 x与px、y与py的差别只在于前者是常量,而后者是变量。 4.1.2 指针运算 1 间接访问运算符 * 运算符“*”称为“间接访问”运算符。 “*指针”形式的“新的变量”,此变量对应着指针所指向的存储单元。 若一个指针p的类型为“type*”,则*p是一个type类型的变量,可以作为左值。 4.1.2 指针运算(续) 与*是一对具有“相反意义”的运算符 x是指向变量x的指针 *(x)是变量x本身 (*(x))又是指向变量x的指针 间接访问运算符也可以用[ ]代替 *px与px[0]具有完全相同的作用。 4.1.2 指针运算(续) 2 指针类型的强制转换 如果要将一个类型不匹配的指针保存在指针变量中,需要经过类型转换。 例如:double x = 2.3; int *p; 由于p与x类型不同,不能直接将x保存在变量p中,但可以先进行类型转换:p=(int*)x; 经过转换并赋值后,p得到了正确的地址,即p指向变量x。但是,根据p的定义,*p是一个int类型的变量,与x并不等同。要想通过p表示x仍需要将类型转换回来,即*((double*)p)才是与x完全相同的变量。 4.1.2 指针运算(续) 3 指针的算术运算 指针可以进行加减算术运算。运算的结果受指针基类型的支配。 如果一个指针p的类型是“type*”,那么,p的加减运算都以sizeof(type)为单位进行。 例: 4.1.2 指针运算(续) 指针的加减运算包括指针变量的自加自减运算(结果是指针)、指针与整数加法和减法(结果是指针)、整数与指针的减法(结果是指针)以及两个指针的减法(结果是整数)。 4.1.2 指针运算(续) 4 指针的比较 可以使用关系运算符比较两个指针的大小,但通常是在两个指针指向同一目标(如一个数组)时才使用。 此时,用一个指针如begin记录数组的首地址,另一个指针如last在数组元素上“滑动”,通过二者的比较和差last-begin可以了解last的移动情况以及与begin的距离。 4.1.3 指针的安全性问题 1 未初始化的指针变量 指针变量p未经赋值或初始化,它随机地指向内存中的某个地址,位置无法把握(这样的指针称为空悬指针,俗称野指针)。 如:int *p; *p = 3; 注意:在没有对指针变量p赋值之前不能使用变量*p。 4.1.3 指针的安全性问题(续) 指针变量p的值可以是变量的地址、字符串常量的地址、数组的地址和动态分配的内存区地址等,例如: double x, *px = x; //变量的地址 char* pc = “a string”; //字符串常量的地址 char a[10], *pa = a; //数组的地址 int* pd = new int[12]; //动态内存的地址 4.1.3 指针的安全性问题(续) 2 空指针 为了保证指针有明确的指向,可以对暂时没有目标的指针变量用0来初始化。 char* p = 0; C语言中通常使用常数NULL表示空指针,而
您可能关注的文档
- 编译原理教程 第二版 教学课件 作者 胡元义 第6-8章 第6章.ppt
- 编译原理教程 第二版 教学课件 作者 胡元义 第6-8章 第7章.ppt
- 编译原理教程 第二版 教学课件 作者 胡元义 第6-8章 第8章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第1章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第2章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第3章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第4章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第5章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第6章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第7章.ppt
文档评论(0)