- 1、本文档共39页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
分析程序例9-16分析例7-18(实参也会改变)数组间如何赋值?数组b的值为其首元素的地址。C语言规定,形参的类型为数组时,数组类型会退化为相应的指针类型。对于一维数组a,由于它的值为首元素a[0]的地址,即整型存储单元的首地址,所以函数的形参inta[2]或inta[]退化为指向整型变量的指针,也就是说swap(inta[])应理解为swap(int*a),在这里形参a不再是一个数组变量,而仅是一个普通的指针变量。在main函数中,函数调用swap(b)执行时,实参b的值为b[0]的地址,故此时参数a的值为b[0]的地址,指针变量a指向了b[0]。数组类型为形参时会退化9.5.2指针和二维数组例9-17如何理解二维数组?以二维数组inta[3][2]={{1,2},{21,22},{31,32}}为例二维数组a有3个数组元素二维数组变量a看作一个虚拟变量,则它的存储单元长度为24个字节(sizeof(a)的值为24),它存储的内容是首元素a[0]的地址0x0012ff00,相关存储单元的类型为sizeof(*a)的值为如何理解一维数组a[0]呢?二维数组变量a二维数组变量a,一维数组变量a[0],整型变量a[0][0]三者的关系如图分析表达式a,a+1,a+2变量a为虚拟的二维数组变量a+1中二维数组变量a表现为右值,故a+1的值为地址同理a+2是a[2]的地址。分析表达式*a,*a+1,*(a+1)+1和**a*a与a[0]等价,a[0]为虚拟的一维数组变量*a+1中*a(a[0])表现为的右值,即a[0][0]的地址0x0012ff00,故表达式的结果为地址0x0012ff04,即a[0][1]的地址。*(a+1)+1中*(a+1)与a[1]等价**a就是*(*a),也为*(a[0]),a[0]的值为其首元素a[0][0]的地址,故*(a[0])与a[0][0]等价有int*p=(int*)0x0012ff00,则表达式p==a的值是否为真。整型指针变量p和二维数组变量a的右值均为0x0012ff00,但是整型指针变量p指向存储单元的类型为整型,而二维数组变量a指向的存储单元的类型为有2个元素的一维整型数组,两者类型不一致,因此两者的比较操作没有实际意义,也就是说表达式p==a有问题。p=a也是有问题的指向有两个元素的一维整型数组的指针变量只有指向有两个元素的一维整型数组的指针变量才能用二维数组变量a赋值。相关指针变量理想的定义方式为int[2]*p,而C语言中实际的定义方式为int(*p)[2](注意不用int*p[2]定义)。定义后,就可以用p=a或p=a[0]把二维数组变量a的右值保存在指针变量中。此时指针变量p、二维数组变量a、一维数组变量a[0]及a[0][0]的关系如图9-9所示。语句char*str1=“hello!”;定义了一个字符型指针变量str1,它初始化后指向了字符串常量hello!。注意与ch[]=“Hello!”的区别。分析语句str=ch中的str与str1的关系。程序为什么会出错呢?哪条语句有问题呢?语句char*str1=“hello!”;定义了一个字符型指针变量str1,它初始化后指向了字符串常量hello!。注意与ch[]=“Hello!”的区别。分析语句str=ch中的str与str1的关系。程序为什么会出错呢?哪条语句有问题呢?数组变量a的右值为a[0]的地址0x0012ff00,相关存储单元的类型为字符型指针,也就是说0x0012ff00存储单元的内容为字符型指针存储单元的地址。字符型指针变量p中存放的内容应为字符型存储单元的地址,而数组变量a的右值为字符型指针存储单元的地址,两者类型不匹配。可以用数组元素a[0]给字符型指针变量p赋值,如p=a[0];或p=*a;。为什么会乱码呢?从图(2)可以看出,pp–1的结果为地址0x0013fefc,与此地址相关的存储单元不属于程序所有,其为野指针。为什么会乱码呢?从图(2)可以看出,pp–1的结果为地址0x0013fefc,与此地址相关的存储单元不属于程序所有,其为野指针。为什么会乱码呢?从图(2)可以看出,pp–1的结果为地址0x0013fefc,与此地址相关的存储单元不属于程序所有,其为野指针。新编C语言程序设计教程
清华大学出版社周二强软件学院计算机科学与工程系配套视频:
博客:第
文档评论(0)