
C语言程序设计 赵晓阳
赵晓阳

第9章指针 ·91指针和指针变量 ·92指针与数组 ·93字符指针与字符串 ·94指针与函数 ·95指针数组 ·9.6多级指针
第9章 指 针 9.1 指针和指针变量 9.2 指针与数组 9.3 字符指针与字符串 9.4 指针与函数 9.5 指针数组 9.6 多级指针

9.1指针和指针变量 ·911指针的基本概念 ·要搞清指针的概念,首先必须要清楚数据是如何存储在内存的,又是 如何进行读取的。 ·在运行一个程序时,程序本身及其所用到的全部数据都要保存在计算 机的内部存储器中。内部存储器是由许多存储单元组成,这些存储单 元又称为内存单元。在微机中,通常将一个字节(Byte)作为一个内存 单元。为了正确地访问这些内存单元,必须对每个内存单元进行统一 编号。根据一个内存单元的编号就能准确地找到该内存单元。 ·我们将一个内存单元的编号称为该内存单元的地址。每个内存单元都 有自己的地址,而且这个地址是唯一的。 下一页返回
9.1 指针和指针变量 9.1.1 指针的基本概念 要搞清指针的概念,首先必须要清楚数据是如何存储在内存的,又是 如何进行读取的。 在运行一个程序时,程序本身及其所用到的全部数据都要保存在计算 机的内部存储器中。内部存储器是由许多存储单元组成,这些存储单 元又称为内存单元。在微机中,通常将一个字节(Byte)作为一个内存 单元。为了正确地访问这些内存单元,必须对每个内存单元进行统一 编号。根据一个内存单元的编号就能准确地找到该内存单元。 我们将一个内存单元的编号称为该内存单元的地址。每个内存单元都 有自己的地址,而且这个地址是唯一的。 下一页 返回

9,1指针和指针变量 ·程序内用到的所有变量,在程序运行的过程中,其值是可以改变的。 在编译时,系统要为每个变量分配连续的内存单元,由于变量的数据 类型不同,每个变量需要分配的内存单元数目也不同。例如,字符型 变量需要分配一个内存单元,it型变量需要分配连续的两个内存单元 f1oat型变量需要分配连续的4个内存单元,而double型变量需要分配 连续的8个内存单元。 ● 当一个变量只占用一个内存单元时,则这个内存单元的地址就是该变 量的地址;当一个变量占用连续的若干个内存单元时,则最前面的一 个内存单元的地址就是该变量的地址,即该变量所占内存空间的起始 地址,或称首地址。 ·对源程序进行编译时,每遇到一个变量,系统要为它分配内存单元, 同时记录变量的名称、数据类型及其地址。 上一页下一页返回
9.1 指针和指针变量 程序内用到的所有变量,在程序运行的过程中,其值是可以改变的。 在编译时,系统要为每个变量分配连续的内存单元,由于变量的数据 类型不同,每个变量需要分配的内存单元数目也不同。例如,字符型 变量需要分配一个内存单元,int型变量需要分配连续的两个内存单元, float型变量需要分配连续的4个内存单元,而double型变量需要分配 连续的8个内存单元。 当一个变量只占用一个内存单元时,则这个内存单元的地址就是该变 量的地址;当一个变量占用连续的若干个内存单元时,则最前面的一 个内存单元的地址就是该变量的地址,即该变量所占内存空间的起始 地址,或称首地址。 对源程序进行编译时,每遇到一个变量,系统要为它分配内存单元, 同时记录变量的名称、数据类型及其地址。 上一页 下一页 返回

9.1指针和指针变量 ·例如,有以下变量定义: 。char ca='t'; ●inti=1o,j=20; ·float d; ·则系统为它们分配的内存单元如图9所示,并记录下相应的变量名、 类型与地址,变量c、i、j和d,数据类型分别为char、int、int和 f10at,地址分别为20o1、2002、2004和2006。 上一页下一页返回
9.1 指针和指针变量 例如,有以下变量定义: char c=′t′; int i=10, j=20; float d; 则系统为它们分配的内存单元如图9-1所示,并记录下相应的变量名、 类型与地址,变量c、i、j和d,数据类型分别为char、int、int和 float,地址分别为2001、2002、2004和2006。 上一页 下一页 返回

9.1指针和指针变量 ·若在程序中有下列赋值语句: ·j=i+j; ·则实际操作过程是:在变量与地址对照表中首先找到变量,取出的 地址,参照它的数据类型it,从该地址开始的连续两个内存单元中取 出整数1o;按相同方法取出变量j中的整数20,相加获得表达式的值。 然后在变量与地址对照表中找到变量j的地址,将运算结果30存入对应 的地址连续两个内存单元中。 ·从上述操作中,我们可以看到,通过变量名查取变量的地址,再从变 量所对应地址的内存单元中获取值或将值存入变量所对应地址的内存 单元中。由于地址起着寻找操作对象(数据)的导向作用,如同是一个 指向操作对象的指针,所以就把地址形象地称为指针。 上一页下一页返回
9.1 指针和指针变量 若在程序中有下列赋值语句: j=i+j; 则实际操作过程是:在变量与地址对照表中首先找到变量i,取出i的 地址,参照它的数据类型int,从该地址开始的连续两个内存单元中取 出整数10;按相同方法取出变量j中的整数20,相加获得表达式的值。 然后在变量与地址对照表中找到变量j的地址,将运算结果30存入对应 j的地址连续两个内存单元中。 从上述操作中,我们可以看到,通过变量名查取变量的地址,再从变 量所对应地址的内存单元中获取值或将值存入变量所对应地址的内存 单元中。由于地址起着寻找操作对象(数据)的导向作用,如同是一个 指向操作对象的指针,所以就把地址形象地称为指针。 上一页 下一页 返回

9.1指针和指针变量 ·91.2指针变量 ·如前所述,变量的指针就是变量的地址。而地址也是一种数据类型, 定义为这种数据类型的变量称为指针变量,指针变量的值是地址值或 指针值。指针和指针变量是两个不同的概念,严格地说,一个指针是 指一个内存单元的地址,它是一个常量。用于存放指针的变量称为指 针变量。因此,一个指针变量的值实质上是某个内存单元的地址。由 此看来,变量的指针就是变量的地址,存放变量地址的变量是指针变 量。若一个指针变量存放了某个变量的地址,则它就指向了该变量。 上一页下一页返回
9.1 指针和指针变量 9.1.2 指针变量 如前所述,变量的指针就是变量的地址。而地址也是一种数据类型, 定义为这种数据类型的变量称为指针变量,指针变量的值是地址值或 指针值。指针和指针变量是两个不同的概念,严格地说,一个指针是 指一个内存单元的地址,它是一个常量。用于存放指针的变量称为指 针变量。因此,一个指针变量的值实质上是某个内存单元的地址。由 此看来,变量的指针就是变量的地址,存放变量地址的变量是指针变 量。若一个指针变量存放了某个变量的地址,则它就指向了该变量。 上一页 下一页 返回

9.1指针和指针变量 ·指针变量的定义 ·C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内 存单元。,指针变量不同于整型变量和其他类型的变量,它是用来专门 存放地址的。必须将它定义为“指针类型” 。例如: ·inti,ji int*pointer_1,*pointer_2; ·第1行定义了两个整型变量和j,第2行定义了两个指针变量pointer.1 和pointer.2,它们是指向整型变量的指针变量。 ·指针变量定义的一般格式为: ·[存储类型]数据类型*指针变量名; 上一页下一页返回
9.1 指针和指针变量 1.指针变量的定义 C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内 存单元。指针变量不同于整型变量和其他类型的变量,它是用来专门 存放地址的。必须将它定义为“指针类型”。例如: int i,j; int *pointer_1,*pointer_2; 第1行定义了两个整型变量i和j,第2行定义了两个指针变量pointer_1 和pointer_2,它们是指向整型变量的指针变量。 指针变量定义的一般格式为: [存储类型] 数据类型 *指针变量名; 上一页 下一页 返回

9.1指针和指针变量 ·说明: ·①指针变量名符合标识符的命名规定,其前面必须加“*”号,这才 表明这里所定义的是一个指针变量。 ②定义格式中的数据类型可以是任何基本数据类型,也可以是以后介 绍的复杂数据类型,如结构体类型、共用体类型等。要注意的是,这 个数据类型不是指针变量中存放的数据类型,而是指针变量将要指向 的变量或对象的数据类型。也就是说,定义成某种数据类型的指针变 量,将来只能用它来指向相同数据类型的变量或对象。另外,一个指 针变量只能指向同一类型的变量。不能忽而指向一个整型变量,忽而 又指向一个买型变量。 ·③省略“存储类型”,则默认为自动型(auto)。 上一页下一页返回
9.1 指针和指针变量 说明: ①指针变量名符合标识符的命名规定,其前面必须加“*”号,这才 表明这里所定义的是一个指针变量。 ②定义格式中的数据类型可以是任何基本数据类型,也可以是以后介 绍的复杂数据类型,如结构体类型、共用体类型等。要注意的是,这 个数据类型不是指针变量中存放的数据类型,而是指针变量将要指向 的变量或对象的数据类型。也就是说,定义成某种数据类型的指针变 量,将来只能用它来指向相同数据类型的变量或对象。另外,一个指 针变量只能指向同一类型的变量。不能忽而指向一个整型变量,忽而 又指向一个实型变量。 ③省略“存储类型”,则默认为自动型(auto)。 上一页 下一页 返回

9.1指针和指针变量 ·例如: ·staticint*pointer_1;/*定义一个指向静态整型变量的指针变量*/ char*pointer2;/*定义一个指向字符型变量的指针变量*/ ·2.指针变量的初始化 ·指针变量的初始化是指在定义指针变量的同时对其赋初值。 ·指针变量的值是个地址值,该地址值就是指针变量所指向的变量的地 址,而变量的地址可通过取地址运算符&来获得。 上一页下一页返回
9.1 指针和指针变量 例如: static int *pointer_1; /*定义一个指向静态整型变量的指针变量*/ char *pointer_2;/*定义一个指向字符型变量的指针变量*/ 2.指针变量的初始化 指针变量的初始化是指在定义指针变量的同时对其赋初值。 指针变量的值是个地址值,该地址值就是指针变量所指向的变量的地 址,而变量的地址可通过取地址运算符&来获得。 上一页 下一页 返回