C语言程序设计教程 王秀贵 等 第7章 指针

C语言程序设计教程 王秀贵 等 第7章 指针

ID:40238600

大小:969.50 KB

页数:92页

时间:2019-07-28

C语言程序设计教程 王秀贵 等 第7章 指针_第1页
C语言程序设计教程 王秀贵 等 第7章 指针_第2页
C语言程序设计教程 王秀贵 等 第7章 指针_第3页
C语言程序设计教程 王秀贵 等 第7章 指针_第4页
C语言程序设计教程 王秀贵 等 第7章 指针_第5页
资源描述:

《C语言程序设计教程 王秀贵 等 第7章 指针》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第7章指针指针和存储器地址指针的类型和指针的初始化指针表达式指针的运算用指针访问一维数组用指针访问二维数组指针与字符串指针数组与指向指针的指针用const限定符修饰指针指针与动态内存分配第页共91页7.1指针和存储器地址我们可以将存储器概念化成存储单元的顺序集合。如图所示,每个存储单元用一个地址来标识,如2020,称做2020号单元。目前,大部分系统都是按字节编址的,即一个字节对应一个地址。图7-1给出的就是字节编址的存储器。通常,一个字节的长度是八个二进制位。存储单元就是用来存放数据的,从程序员的角度看,内存中的每个

2、存储单元总是存储着某个值的。第页共91页一个存储位置对应一个地址第页共91页一个字节作为数据的独立存储单位,在大多数情况下远远不能满足应用的要求,因为它所能表示的值的范围非常有限。为了存储更大的值,我们往往将两个或更多的字节在逻辑上组合成一个更大的存储单位。例如,大多数机器以所谓“字”为单位存取整数,每个字一般由2个字节或4个字节组成。尽管一个字包含了两个字节,它有两个物理地址,但从程序员的角度看,这个字只有一个地址,它一般是首字节的地址。但也不一定,有些系统将末字节的地址作为字的地址。第页共91页每个字的长度为2字节

3、第页共91页我们在编程中定义变量,例如,设有如下定义:inta=100,b=199;第页共91页7.2指针的类型和指针的初始化再谈指针的定义和指针的初始化指针的类型第页共91页7.2.1再谈指针的定义和指针的初始化和其他变量一样,指针变量在使用前必须先定义。在2.5.6就已经介绍了如何定义指针变量。读者要注意指针定义语句的微妙之处。定义语句:int*nPtr1,nSum;定义了一个int*类型的指针变量nPtr1,可读作“nPtr1是指向整数值的指针”,另外,还定义了一个整型变量nSum。由于C语言在书写形式上的过度自

4、由,很可能会写出如下形式的定义语句:int*nPtr1,nSum;第页共91页请注意它与前面那个定义语句在形式上的细微差别。它没有语法错误,但本质上,它们两者都表达的是同一个意思。那么你是如何理解第二个定义语句的呢?你是否被它的外表所蒙骗,理所当然地认为它定义了两个指针变量了呢?正确的理解应该是,星号只是表达式*nPtr1的一部分,nPtr1是一个指针,nSum是一个int变量。可见,间接访问运算符“*”并不针对定义语句中的所有变量。每定义一个指针都必须在其名字前面用“*”作前缀。例如,要将上述两个变量定义为指向整数值

5、的指针变量,正确的写法是:int*nPtr1,*nSum;第页共91页NULL是在头文件中定义的一个常量。将NULL赋给一个指针,表示那个指针并不指向任何目标,我们称值为NULL的指针为“空指针”。将一个指针初始化为0等价于把该指针初始化为NULL,但是用NULL更好。数值0是唯一能够直接赋给指针变量的整数值。第页共91页由于NULL指针并未指向任何目标,因此,对NULL指针施加间接访问运算是非法的。不同编译器对这个非法操作的处理可能不尽相同。有些系统会捕获并报告这个错误,然后终止程序;有些系统允许这

6、个运算被执行,而将由此产生的后果推给程序员。总之,空指针在概念上不同于“悬挂”指针。空指针可以确保不指向任何目标,而悬挂指针可能指向任何地方。但是,对空指针或悬挂指针施加间接访问运算,都可能会导致致命的执行错误或意外地修改重要的数据。如果修改了数据的程序能够完成运行,但提供的结果是毫无意义的。第页共91页7.2.2指针的类型指针类型的意义在于可以指示编译器怎样解释特定地址上内存的内容——这些数据的含义或逻辑关系,以及该内存区域应该跨越多少存储单元。例如,对于32位机器,设p是一个int型指针,p指向的位置是2020,那

7、么跨越的地址空间是2020~2023,表达式*p将这四个字节的内存区域的内容解释为一个32位的整数;如果p是一个double型指针,p指向的位置是2020,那么跨越的地址空间是2020~2027,表达式*p将这8个字节的内存区域的内容解释为一个64位的浮点数。第页共91页由此可见,一个指针不能指向与其类型不同的目标。下面的例子说明了这一点。inta,*nPtr;/*指针nPtr的类型是int**/floatx,*fPtr=&a;/*指针fPtr的类型是float**/nPtr=fPtr;第页共91页上面的第二个语句试图

8、将一个浮点类型指针指向一个整数,这是非法的。因为,编译器已经将fPtr解释为浮点类型指针,因此,它将要指向的目标空间的大小和该空间只能存储什么内容都已经确定,而实际赋给它的值与预期的不符。第三个语句是将浮点类型指针的值赋给整数类型指针,这同样会导致编译时出错。不是说nPtr在物理上不能持有与变量x相关联的内存地址,它能够,但是不允

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

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

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