- 1、本文档共66页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 指针 8.1 地址与指针 8.2 指针变量 8.3 指针与数组 8.4 指针与字符串 8.5 指针与函数 8.6 指针数组 8.7 多级指针 本章小结 习题参考答案 8.1 地址与指针 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数是不相同的,例如整型数据(int)占2个字节,字符型数据占1个字节等。为了快速地、准确地访问这些内存单元,计算机为每个内存单元进行编号,内存单元的编号也就是内存单元的地址。根据内存单元的地址就可以迅速找到所需的内存单元,在C语言中,通常也把这个地址称为指针。所以说指针本质上就是地址。 内存单元的地址(即指针)和内存单元的内容是两个不同的概念。可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时,银行工作人员将根据我们的帐号去找我们的存款单,找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针,存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。 严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。定义指针的目的是为了通过指针去访问内存单元。 引进指针的目的,就是为了能直接访问内存单元,为了方便系统软件的编写。在C语言中,不仅数据单元可以通过指针来访问,程序代码存放在内存的位置也可以被看作指针,用于进行程序的调用。程序中要获取数据单元或代码的指针可以很简单地完成。例如存在一个变量a,获取该变量内存地址的方法是使用取地址运算符,即a;再如存在一个函数printf(),获取该函数的起始地址的方法是直接使用函数名,即printf。 将数据划分成不同类型,可以避免数据错误使用。虽然指针本质上都是内存地址,为了避免被错误使用,C语言把指针划分成了不同类型,有整型指针、实型指针、字符型指针等等,在定义指针变量时要求明确指出指针变量所指向的数据类型。不同类型的指针变量不可以直接进行赋值的。例如整型指针不允许赋给实型指针变量。 一般变量中保存的是数据,而指针变量中只能保存变量的地址,不能直接保存数据,图8.2具体描述了两者之间的区别。 以下操作使用不正确: pointer1=j; /* pointer1只能保存地址(即指针),不允许保存整型数据*/ pointer1=f; /* pointer1不能保存不同类型数据的地址(即指针)*/ pointer2=3.14; /* 3.14是常数,不能使用来获取地址(即指针)*/ 既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构的地址。在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。这样一来,凡是出现数组,函数的地方都可以用一个指针变量来表示,只要该指针变量中赋予数组或函数的首地址即可。这样做,将会使程序的概念十分清楚,程序本身也精练、高效。在C语言中,一种数据类型或数据结构往往都占有一组连续的内存单元。用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是“指向”数据结构的,因而概念更为清楚,表示更为明确。这也是引入“指针”概念的一个重要原因。 8.2 指针变量 8.2.1 指针的定义 指针变量与一般变量一样,必须先定义后使用。指针变量的定义的一般形式为: 类型说明符 *变量名; 其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。因此指针变量也有类型,其类型是指针变量所指对象的类型,而指针变量自身的类型就是指针型。 例如: int *p1; 表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。 例如: int *p2; /*p2是指向整型变量的指针变量*/ float *p3; /*p3是指向浮点变量的指针变量*/ char *p4; /*p4是指向字符变量的指针变量*/ 应该注意的是,一个指针变量只能指向同类型的变量,如p3只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。 8.2.2指针变量的引用 C语言提供了两种与指针有关的运算符: ——取地址运算符。 *——
文档评论(0)