C语言程序设计教程课件07662-7第7章节指针.pptVIP

C语言程序设计教程课件07662-7第7章节指针.ppt

  1. 1、本文档共113页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章 指针 指针和存储器地址 指针的类型和指针的初始化 指针表达式 指针的运算 用指针访问一维数组 用指针访问二维数组 指针与字符串 指针数组与指向指针的指针 用const限定符修饰指针 指针与动态内存分配 7.1 指针和存储器地址 我们可以将存储器概念化成存储单元的顺序集合。如图所示,每个存储单元用一个地址来标识,如2020,称做2020号单元。目前,大部分系统都是按字节编址的,即一个字节对应一个地址。图7-1给出的就是字节编址的存储器。通常,一个字节的长度是八个二进制位。存储单元就是用来存放数据的,从程序员的角度看,内存中的每个存储单元总是存储着某个值的。 一个存储位置对应一个地址 一个字节作为数据的独立存储单位,在大多数情况下远远不能满足应用的要求,因为它所能表示的值的范围非常有限。为了存储更大的值,我们往往将两个或更多的字节在逻辑上组合成一个更大的存储单位。例如,大多数机器以所谓“字”为单位存取整数,每个字一般由2个字节或4个字节组成。 尽管一个字包含了两个字节,它有两个物理地址,但从程序员的角度看,这个字只有一个地址,它一般是首字节的地址。但也不一定,有些系统将末字节的地址作为字的地址。 每个字的长度为2字节 我们在编程中定义变量,例如,设有如下定义:int a = 100, b = 199; 7.2 指针的类型和指针的初始化 再谈指针的定义和指针的初始化 指针的类型 7.2.1 再谈指针的定义和指针的初始化 和其他变量一样,指针变量在使用前必须先定义。在2.5.6就已经介绍了如何定义指针变量。读者要注意指针定义语句的微妙之处。定义语句: int *nPtr1, nSum; 定义了一个int* 类型的指针变量nPtr1,可读作“nPtr1是指向整数值的指针”,另外,还定义了一个整型变量nSum。 由于C语言在书写形式上的过度自由,很可能会写出如下形式的定义语句: int* nPtr1, nSum; 请注意它与前面那个定义语句在形式上的细微差别。它没有语法错误,但本质上,它们两者都表达的是同一个意思。那么你是如何理解第二个定义语句的呢?你是否被它的外表所蒙骗,理所当然地认为它定义了两个指针变量了呢?正确的理解应该是,星号只是表达式*nPtr1的一部分,nPtr1是一个指针,nSum是一个int变量。可见,间接访问运算符“*”并不针对定义语句中的所有变量。每定义一个指针都必须在其名字前面用“*”作前缀。例如,要将上述两个变量定义为指向整数值的指针变量,正确的写法是: int *nPtr1, *nSum; NULL是在头文件stdio.h中定义的一个常量。将NULL赋给一个指针,表示那个指针并不指向任何目标,我们称值为NULL的指针为“空指针”。将一个指针初始化为0等价于把该指针初始化为NULL,但是用NULL更好。数值0是唯一能够直接赋给指针变量的整数值。 由于NULL指针并未指向任何目标,因此,对NULL指针施加间接访问运算是非法的。不同编译器对这个非法操作的处理可能不尽相同。有些系统会捕获并报告这个错误,然后终止程序;有些系统允许这个运算被执行,而将由此产生的后果推给程序员。 总之,空指针在概念上不同于“悬挂”指针。空指针可以确保不指向任何目标,而悬挂指针可能指向任何地方。但是,对空指针或悬挂指针施加间接访问运算,都可能会导致致命的执行错误或意外地修改重要的数据。如果修改了数据的程序能够完成运行,但提供的结果是毫无意义的。 7.2.2 指针的类型 指针类型的意义在于可以指示编译器怎样解释特定地址上内存的内容——这些数据的含义或逻辑关系,以及该内存区域应该跨越多少存储单元。例如,对于32位机器,设p是一个int型指针,p指向的位置是2020,那么跨越的地址空间是2020~2023,表达式*p将这四个字节的内存区域的内容解释为一个32位的整数;如果p是一个double型指针,p指向的位置是2020,那么跨越的地址空间是2020~2027,表达式*p将这8个字节的内存区域的内容解释为一个64位的浮点数。 由此可见,一个指针不能指向与其类型不同的目标。下面的例子说明了这一点。 int a, *nPtr; /* 指针nPtr的类型是int* */ float x,*fPtr = a; /* 指针fPtr的类型是float* */ nPtr = fPtr; 上面的第二个语句试图将一个浮点类型指针指向一个整数,这是非法的。因为,编译器已经将fPtr解释为浮点类型指针,因此,它将要指向的目标空间的大小和该空间只能存储什么内容都已经确定,而实际赋给它的值与预期的不符。 第三个语句是将浮点类型指针的值赋给整数类型指针,这同样会导致编译时出错。不是说

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档