《c数组与指针》word版

《c数组与指针》word版

ID:30364785

大小:96.69 KB

页数:14页

时间:2018-12-29

《c数组与指针》word版_第1页
《c数组与指针》word版_第2页
《c数组与指针》word版_第3页
《c数组与指针》word版_第4页
《c数组与指针》word版_第5页
资源描述:

《《c数组与指针》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、c数组与指针2c数组与指针(2)2010-04-0511:40第四章[]运算符的本质数组是存在于人们头脑中的一个逻辑概念,而编译器其实并不知道有数组这个东西,它所知道的,只是运算符,当遇到运算符的时候,编译器只是简单地把它转换为类似*(*(a+i)+j)这样的等价表达式,之所以是这种表达式,如前几章所述,是因为C语言的数组实现本质上是数组的嵌套。由于这种等价关系的存在,会产生一些古零精怪的表达式,例如:10[a]这个表达式初看上去让人摸不着头脑,它是什么呢?如上所述,编译器会把它转换为*(10+a),把a和10调换一下,就是*(a+10)了,这个就是a[10]。

2、运算符之前还可以是一个表达式,例如:(10+20)[a]。严格来讲,以上两个表达式是非法的,因为C89对于数组的引用(注意不是数组定义)规定:带下标的数组引用后缀表达式由一个后缀表达式后跟一个括在方括号中的表达式组成。方括号前的后缀表达式的类型必须为"指向T类型的指针",其中T为某种类型;方括号中表达式的类型必须为整型。这个规定说明,进行数组引用的时候,运算符的左边并非必须为数组名,而可以是一个表达式,但这个表达式的类型必须为"指向某类型的指针"。显然10跟(10+20)连地址都不是,因此实际上他们是非法的,编译器在这里并没有严格遵守标准的规定。但如果是:int

3、a[10],*p=a;(p+1)[2]这样就是合法的,因为p+1的结果仍然是一个指针。要注意的是,虽然后缀表达式是一个"指向某类型的指针",但不要被这里所说的指针一词搞混了,上面的规定不能反过来使用。还是以上面的例子为例,我们可以p[i]这样使用p,这是符合上述规定的,但并不能因为指针p能够以p[i]这种形式使用就认为p是一个数组,这就错误了,不能反过来应用上述规则。最后说一下编译器对&*的优化,对于数组intc数组与指针2c数组与指针(2)2010-04-0511:40第四章[]运算符的本质数组是存在于人们头脑中的一个逻辑概念,而编译器其实并不知道有数组这个东

4、西,它所知道的,只是运算符,当遇到运算符的时候,编译器只是简单地把它转换为类似*(*(a+i)+j)这样的等价表达式,之所以是这种表达式,如前几章所述,是因为C语言的数组实现本质上是数组的嵌套。由于这种等价关系的存在,会产生一些古零精怪的表达式,例如:10[a]这个表达式初看上去让人摸不着头脑,它是什么呢?如上所述,编译器会把它转换为*(10+a),把a和10调换一下,就是*(a+10)了,这个就是a[10]。运算符之前还可以是一个表达式,例如:(10+20)[a]。严格来讲,以上两个表达式是非法的,因为C89对于数组的引用(注意不是数组定义)规定:带下标的数组

5、引用后缀表达式由一个后缀表达式后跟一个括在方括号中的表达式组成。方括号前的后缀表达式的类型必须为"指向T类型的指针",其中T为某种类型;方括号中表达式的类型必须为整型。这个规定说明,进行数组引用的时候,运算符的左边并非必须为数组名,而可以是一个表达式,但这个表达式的类型必须为"指向某类型的指针"。显然10跟(10+20)连地址都不是,因此实际上他们是非法的,编译器在这里并没有严格遵守标准的规定。但如果是:inta[10],*p=a;(p+1)[2]这样就是合法的,因为p+1的结果仍然是一个指针。要注意的是,虽然后缀表达式是一个"指向某类型的指针",但不要被这里所

6、说的指针一词搞混了,上面的规定不能反过来使用。还是以上面的例子为例,我们可以p[i]这样使用p,这是符合上述规定的,但并不能因为指针p能够以p[i]这种形式使用就认为p是一个数组,这就错误了,不能反过来应用上述规则。最后说一下编译器对&*的优化,对于数组inta[10],如果对其中一个元素取地址,例如&a[1],这条表达式等价于&*(a+1),编译器并不会先计算*再运算&,而是对&*两个运算符进行优化,把它们同时去掉,因为两者的作用是相反的,最后得到计算的是a+1表达式。第五章指向数组的指针讲到第五章了,数组两个字还离不开我们的左右,数组的内容也真多,另一方面也

7、因为数组与指针的关系的确非常密切。通常,对于inta[8][9]这个二维数组,我们可以这样定义一个指向它的指针:int(*p)[9];这个声明的形式跟人们所熟悉的int*p的形式大相庭径,初学者通常会感到迷惑,不理解的地方大致有四个:1。为什么会以这种形式声明?2。(*p)应该如何理解?3。为什么必须把第二维显式地声明?4。为什么忽略第一维?下面我们就一起逐个讨论这四个问题:1。这种形式是C标准的声明语法规定的,由于本章不是对标准的解释,只是对标准的应用,因此笔者尽量以简洁的方式解释这个声明,详细的讨论将在第七章进行。C标准的声明包含了两部分:声明:声明说明符初

8、始化声明符表opt(op

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。