深入浅出C指针与数组

深入浅出C指针与数组

ID:38701992

大小:44.50 KB

页数:7页

时间:2019-06-17

深入浅出C指针与数组_第1页
深入浅出C指针与数组_第2页
深入浅出C指针与数组_第3页
深入浅出C指针与数组_第4页
深入浅出C指针与数组_第5页
资源描述:

《深入浅出C指针与数组》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、深入浅出C指针(一)基本概念初学者在学习C语言时,通常会遇到两个瓶颈,一个是“递归”,一个是“指针”。大学老师在讲述这两个知识点时通常都是照本宣科,而没有站在一个初学者的角度来审视问题,更没有剖析其内部机理。本人在此将发表一系列技术文章,希望能将C语言中“指针”这一概念讲述清楚,希望初学者能从中收益。在此笔者也极力推荐KennethA.Reek写的《PointersOnC》这本书。1.内存和地址初学者面对内存一词时总是有一种既陌生又熟悉的感觉。首先,在日常生活中大家总是会讨论某某设备内存有多大,是不是该加一个内存条等等。但是,内存究竟是什么?在

2、此,笔者并不想深入探讨内存的本质,以及内存在不同操作系统上的结构有什么区别等等这一系列问题。这里只希望初学者知道以下三个问题即可:(1)内存是计算机在运行过程中存储数据的地方(2)内存被分割成了“无数”个小区域,每个区域的大小在不同的环境下有所不同,可能是1个字节,2个字节,或者多个字节。(3)每个小区域都有一个独一无二的标识,即我们后面所说的地址(指针)。(4)每个小区中都有包含一个值,可以是整形,浮点型,字符型等等。我们可以形象的用下图表示内存的结构:100104108112116

3、

4、

5、

6、

7、-------------------------

8、-----------------------------------------------(542)(3.14)(‘A’)(12323)(-12)如图所示,上方表示内存的地址,下方括号中的内容表示该地址下内存中的值。我们想访问这些内存中的值,只需要知道内存地址即可。但是,我们怎么知道我们要访问的内容其内存地址是多少?的确,要记住这些内存地址几乎是不可能的,所以,编译器可以让我们用变量的形式访问他们,于是这张图可以变成如下所示:total_countPim_chmoneynumber

9、

10、

11、

12、

13、-------------------------

14、-----------------------------------------------(542)(3.14)(‘A’)(12323)(-12)我们将内存地址变成了我们更容易记住的变量,这样我们在编写程序的时候就可以方便的访问内存中的数据。但是,请记住,这只是编译器帮助我们进行了优化,而真正编译后的机器码则是通过真正的内存地址来访问内存中的数据,即寻址,关于计算机的寻址过程,有兴趣的读者可以参考计算机组成原理或者汇编语言等书。2.值和类型我们首先来看一下下面这几个表达式:inttotal_count=542;floatPi=3.14;in

15、t*p1=&total_count;char*p2=&m_ch;前两个表达式很好理解,我们申明了一个整形和一个浮点型变量,并分别赋值为542和3.14。那后面两个表达式是什么意思呢?我们姑且可以简单记住:在申请变量的表达式中,如果类型的后面出现了*号,那么这个变量就叫做指针,或者指针变量。指针变量分为很多种类型,例如整形指针,浮点型指针,字符型指针等等。好了,我们知道了指针的概念,那么,指针到底是什么?指针也是变量,即指针变量,它和其他的变量在本质上是没有区别的。但是指针变量只能保存一种值,就是地址。也许你会问了,既然指针保存的是地址,那么为什

16、么要将指针分为那么多的种类,整形值要有整形指针,字符型值要有字符型指针?为什么不能用一种指针就把所有的地址都包含了呢?难道不同类型变量的地址也不同吗?这个问题,本人没有查阅过官方的解释,首先可以肯定,内存地址在理论上是没有任何区别的,无论是用来保存什么类型变量的内存,其本质都是01Bit构成的区域,内存地址当然也不会有任何区别,从纯技术技术的角度上讲,笔者认为编译器完全可以建立一种制度,用统一的指针类型保存不同变量的地址,这完全不会影响程序的运行。但是编译器没有这样做的原因,笔者分析主要是出于安全性的考虑。当程序员有意或无意的将两种不同类型的指

17、针所指向的内存内容进行赋值时,如果编译器事先不能做出检查,那么也许会在程序运行过程中出现异常,例如产生非常严重的缓冲区溢出错误。3.指针的间接访问符好了,我们将问题回到这几个表达式上来。现在的问题是p1和p2这两个变量中保存的是什么。拿p1为例,也许你可以这样理解,因为p1是指针变量,所以他的值应该和他指向的内存中的值一样,所以p1=542.这样理解看似非常符合逻辑,但却是一个大的错误。虽然p1很特殊,但是指针变量也是变量,它不会聪明到自动去完成一个非常复杂的自动间接访问操作。p1的值实际是100,即变量total_count的地址。但是读者请

18、注意,100并不是传统意义上整形100,例如int*p1=100;这是一个错误的表达式,因为不能直接将整形值赋值给指针变量,作如下变化即可int*p1

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

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

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