第6章指针讲述.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章指针讲述

6.1 指针和指针变量 6.1.1 地址和指针的概念   在计算机中,内存是一个连续的存储空间;在这个空间中每一个内存单元都对应一个唯一的内存地址;并且,内存的编址由小到大是连续的,它的基本单位是“字节”。对程序中定义的变量,编译过程中系统根据该变量定义时获得的类型信息,为其分配相应长度的连续内存单元用来存放它的值。 例如在C语言中,一个整型变量占4个字节的内存单元,而一个双精度型变量占8个字节的内存单元。并且,给每个变量分配的这连续几个内存单元的起始地址就是该变量的地址;也即,编译后每一个变量都有一个确定的变量地址,对变量的访问就是通过这个变量地址进行的。当引用一个变量时,实际上就是从该变量地址开始的若干连续单元中取出数据;当给一个变量赋值时,则是将这个值按该变量的类型存入该变量地址开始的若干连续内存单元中。显然,变量地址所对应的内存单元中存放的内容即为该变量的值。   我们可以通过地址运算符“”得到变量地址。例如:     int a=10;   则a表示变量a在内存中的地址(变量地址),通过下面的printf语句就可以输出a的变量地址:     printf(%x\n,a); /*输出变量a的16进制地址*/   通常把变量地址形象地称之为“指针”,意思是通过这个“指针(即地址)”可以找到该变量。在C语言中,允许使用一种特殊的变量来专门存放某个变量的地址(即该特殊变量的内存单元中存放的是某个变量的地址而不是其他数据,这一点与普通变量不同),这种特殊变量就称为指针变量。   注意,指针是一个地址,且主要是指变量或数组元素的地址,它是一个常量;而指针变量本身是一个变量并且是一个存放地址的变量,主要用来存放其他变量或数组元素的地址;也即,指针变量的值即为指针。在后续章节中我们还可以看到:指针变量的值不仅可以是像int、float等简单变量的地址,也可以是数组、结构体等构造类型的变量地址,即用指针变量来指向某种构造类型的变量,这样就可以访问到该类型变量中的任一元素(成员)。这是引入指针变量的一个重要原因。   引入指针变量的另一原因是:C语言允许在程序的执行过程中生成新的变量,由于这种变量是在程序执行过程中动态产生的,故无法事先在程序或函数说明部分对其进行定义。因此,这种动态生成的变量没有名字,所以只能通过指针变量去间接地访问它(即由指针变量所存放的该动态变量的地址去访问这个动态变量)。   有了指针变量,访问变量的方式也得到了扩充:一种是我们前面介绍过的按变量名直接存取变量值的访问,称为直接访问;另一种就是本章介绍的通过指针变量所存放的变量地址找到该变量后再对该变量值进行的存取访问,称为间接访问。   在第9章还可以看到,我们可以把函数的首地址(该函数所对应的程序代码段首地址)赋给一个指针变量(此时,函数名可以看做为是一个变量),使该指针变量指向这个函数,然后通过指针变量就可以找到并执行这个函数;这和上面通过指针变量来存取某个变量值的概念是完全不同的。 6.1.2 指针变量的定义和初始化   1. 指针变量的定义   指针变量是用来存放其他变量地址的变量,所以和普通变量一样必须先定义、后使用。指针变量定义的一般形式如下:    类型标识符 *变量名;   注意:   (1) 在指针变量的定义中,变量名前的“*”号仅是一个符号,它表示该变量名为一个指针变量而不是指针运算符;如果定义时变量名前无“*”则为一普通变量而不是指针变量。   (2) 类型标识符表示该指针变量所指向那个变量的数据类型;也即,一旦定义了一个指针变量,则它只能指向由类型标识符所规定的这种类型变量,而不允许指向其他类型的变量。注意,类型标识符并不是指针变量自身的数据类型,因为所有的指针变量都是用来存放地址值的,其数据类型必然为整型,故无需再进行说明。例如:     int *p1,*p2;     char *q;   则指针变量p1、p2只能指向整型变量,而指针变量q则只能指向字符型变量。注意,指针变量p1、p2不能如下定义:     int *p1,p2;   这种定义方式则定义了p1为指针变量,而p2为整型变量;也即在定义中以“?*?”开头的变量是指针变量,否则不是指针变量。   2. 指针变量的初始化   指针变量的初始化有两种方法:一种是先定义再赋初值,另一种是在定义的同时赋初值。需要注意以下两点:   (1) 不要引用未经赋值的指针变量,未经赋值的指针变量是不能使用的,否则将造成系统混乱。   (2) 给指针变量赋值只能赋给地址值,而不能是其他任何类型的数据,否则会引起错误。   下面我们通过例子来看一下两种初始化的方法:     int a;     int *p1;     p1=a;   这是先定义再赋初值的方法

文档评论(0)

441113422 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档