新编C语言程序设计教程第9章指针2.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
新编C语言程序设计教程第9章指针2

9.4.1 指针支持的运算 指针变量可以与一个整数做加法或减法运算。 如果一个整型指针变量pi的右值为0x0012 ff00,则pi + 1的值是多少呢? 做加法运算时变量pi应表现为右值0x0012 ff00,但是pi + 1的结果不是0x0012 ff01! 指针变量指向的是存储单元,其值0x0012 ff00仅是存储单元的首地址,pi + 1的结果也为指针变量且指向后面相邻的整型存储单元,因此新的指针变量的右值为0x0012 ff04,其类型与指针变量pi的相同。 例9-10 分析下面程序的输出 例9-11 设指针变量p的右值为0x0012 ff00,求其定义如下时p+1的右值。1. char *p; 2. char (*p)[5] 1. 指针变量p所指向的存储单元为字符型,故p+1的右值为0x0012 ff01,相关存储单元的类型也为字符型。 2. char (*p)[5]定义中先解释*p,故变量p为指针变量,其类型为char [5],即长度为5的字符型数组,因此,p + 1的右值为0x0012 ff05,相关存储单元的类型也是长度为5的字符型数组。 指针变量的减法 与加法相同,p - 1的结果为指向前面相邻的存储单元的指针变量,其右值为相关存储单元的首地址,类型也与变量p的相同。 两个同类型的指针变量可以相减,结果为整数,表示两个变量之间相差几个同样的存储单元。对于图9-5的指针变量p,(p + 2) –p的值为2。 p + 2的值为a[2]的地址0x0012 ff10,p的值为0x0012 ff00,两者相差2个存储单元(double类型共16个字节)。 指针变量的运算 对于指针变量p,p = p + 1;同样可简写为p += 1;或++p;、p++;。p = p – 1;与此类似。 两个同类型的指针变量可以进行等于(==)或不等于(!=)比较运算,如果两个指针变量相等,则它们指向同一块存储单元。两个同类型的指针变量也可以进行、、=和=比较运算。 指针变量的运算通常与数组相关时才有实际意义。 pi + 1的左值 pi + 1的结果为指向后面相邻的一个类型相同的存储单元的指针变量,其右值为0x0012 ff04,但其左值 运算器中的存储单元 pi + 1的计算在运算器中进行,计算结果也位于运算器中。运算器中的存储单元仅供运算器使用,应用程序只能读其中的内容而不能写入数据。 表示pi + 1的结果的指针变量可理解为一个无名临时变量。与无名临时变量相关的存储单元多位于运算器中。强制类型转换的结果、C语言中许多表达式的结果均可理解为无名临时变量。 无名临时变量的特点是程序只能读取其值而不能写入数据。 赋值语句pi + 1 = 3; 以赋值语句pi + 1 = 3;为例,该语句先进行pi + 1的操作,此时变量pi虽然在赋值操作符的左边,但要进行加法运算,变量pi表现为右值,运算结果如图所示的无名临时变量。 应用程序不能使用无名临时变量的左值向其写入数据,因此语句pi + 1 = 3;不可能把整数3存入相关存储单元,也就是说该语句非法! 表达式的左值性或右值性 具有左值性的表达式可以位于赋值操作符的左边,而具有右值性的表达式只能位于赋值操作符的右边。 表达式pi + 1就具有右值性而不具有左值性。 C语言中许多表达式的结果均为无名临时变量,因此可以简单地把表达式的左值性问题归结为与无名临时变量相关的地址是否可以被应用程序写入的问题。 如果与无名临时变量相关的地址不允许程序写入,则相关的表达式就表现为右值性。显然大部分C语言表达式表现为右值性。 例9-12 相关变量的内存状态如图9-6(1)所示,判断表达式*(pi + 1)和*(i)是否表现为左值性。 pi + 1的结果为如图9-6(2)所示的无名临时变量,其左值不知,右值为0x0012 ff04。*(pi + 1)在赋值操作符左边时表现为无名临时变量的存储内容,其值为地址0x0012 ff04,注意,无名临时变量可以读取不能写入。应用程序有权存取与地址0x0012 ff04相关的存储单元,因此,类似*(pi + 1) = 3;的语句可以正常执行,表达式*(pi + 1)为左值性。 判断表达式*(i)是否表现为左值性 i的结果也可理解为如图9-6(2)所示的无名临时变量,其左值不知,右值为0x0012 ff00。 *(i)在赋值操作符左边时表现为无名临时变量的存储内容,其值为地址0x0012 ff00。应用程序有权存取与地址0x0012 ff00相关的存储单元,因此,类似*(i ) = 3;的语句可以正常执行,表达式*(i)为左值性。 9.5 指针与数组 在C语言中,指针与数组有着密切的关系,这种关系表现在对数组元素的引用可以改写成对指针的间接引用。 有数组

文档评论(0)

wumanduo11 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档