制作:方斌 C语言程序设计 教程 郧阳师范高等专科学校 计算机科学系 方斌制作
制 作:方 斌 C语言程序设计 教程 郧阳师范高等专科学校 计算机科学系 方 斌 制作
制作:方斌 第10章指针 8101指针的概念9106返回指针的函数 §107指针数组和指向指针 §102变量的指针的指针 §10.3数组的指针§10.8指针使用小结 §104字符串的指针本章要求和作业 §10.5函数的指针
制 作:方 斌 第10章 指针 §10.1 指针的概念 §10.6 返回指针的函数 § 10.2 变量的指针 § 10.7 指针数组和指向指针 的指针 § 10.3 数组的指针 § 10.8 指针使用小结 § 10.4 字符串的指针 本章要求和作业 § 10.5 函数的指针
制作:方斌 10.1指针的概念 指针( pointer):是一个变量的地址。 指针变量:是一个变量,其值是另一个变量的地址 任何变量都在计算机內存中占有一块内存区域,变量的值就存放在这块 内存区域之中,(寄存器变量不在内存中,而是在CPU的寄存器中)。 1内存地址—内存中存储单元的编号 (1)计算机硬件系统的内存储器中,拥有大量的存储单元(容量以 1字节为单位)。 为了方便管理,必须为每一个存储单元编号,这个编号就是存储单 元的“地址”。每个存储单元都有一个惟一的地址。 (2)在地址所标识的存储单元中存放数据。 注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。 2变量地址—系统分配给变量的內存单元的起始地址 假设有这样一个程序:
制 作:方 斌 10.1 指针的概念 指针(pointer):是一个变量的地址。 指针变量:是一个变量,其值是另一个变量的地址。 任何变量都在计算机内存中占有一块内存区域, 变量的值就存放在这块 内存区域之中,(寄存器变量不在内存中,而是在CPU的寄存器中)。 1.内存地址──内存中存储单元的编号 (1)计算机硬件系统的内存储器中,拥有大量的存储单元(容量以 1字节为单位)。 为了方便管理,必须为每一个存储单元编号,这个编号就是存储单 元的“地址”。每个存储单元都有一个惟一的地址。 (2)在地址所标识的存储单元中存放数据。 注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。 2.变量地址──系统分配给变量的内存单元的起始地址 假设有这样一个程序:
制作:方斌 main( Rint num scanf(%od,&num) d Addr printf("num=%d\n num num 3000 C编译程序编译到该变量定义语句时,将变量nm登录到“符号表” 中。符号表的关键属性有两个:一是“标识符名(id)”,二是该标识 符在内存空间中的“地址(addr)”。 为描述方便,假设系统分配给变量num的2字节存储单元为3000和 3001,则起始地址3000就是变量num在内存中的地址。 3变量值的存取—通过变量在内存中的地址进行 系统执行“scan”od-;&num);”和“ printf(℃num=%dmn",num);时, 存取变量num值的方式可以有两种:
制 作:方 斌 main() { int num; scanf("%d",&num); printf("num=%d\n", num); } C编译程序编译到该变量定义语句时,将变量num 登录到“符号表” 中。符号表的关键属性有两个:一是“标识符名(id)” ,二是该标识 符在内存空间中的“地址(addr)” 。 为描述方便,假设系统分配给变量num的2字节存储单元为 3000 和 3001,则起始地址3000就是变量num在内存中的地址。 3.变量值的存取──通过变量在内存中的地址进行 系统执行“scanf(”%d“,&num);”和“printf(”num=%d\n“, num);”时, 存取变量num值的方式可以有两种: id Addr num 3000
制作:方斌 (1)直接祊问一直接利用变量的地址进行存取 1)上例中scan(9d2knum)的执行过程是这样的: 用变量名num作为索引值,检索符号表,找到变量num的起始地址 3000;然后将键盘输入的值(假设为3)送到内存单元3000.和3001中。此 时,变量num在内存中的地址和值,如图所示。 2) printf"num-%dn",num)的执行过程,与scan0很相似 首先找到变量mum的起始地址3000,然后从3000和3001中取出其值, 最后将它输出。 (2)问接访问通过另一变量访问该变量的值 C语言规定:在程序中可以定义一种特殊的变量(称为指针变量), 用来存放其它变量的地址。 2998300030023004 3
制 作:方 斌 (1)直接访问──直接利用变量的地址进行存取 1)上例中scanf(“%d”,&num)的执行过程是这样的: 用变量名num作为索引值,检索符号表,找到变量num的起始地址 3000;然后将键盘输入的值(假设为3)送到内存单元3000和3001中。此 时,变量num在内存中的地址和值,如图所示。 2)printf("num=%d\n",num)的执行过程,与scanf()很相似: 首先找到变量num的起始地址3000,然后从3000和3001中取出其值, 最后将它输出。 (2)间接访问──通过另一变量访问该变量的值 C语言规定:在程序中可以定义一种特殊的变量(称为指针变量), 用来存放其它变量的地址。 3 2998 3000 3002 3004
制作:万斌 例如,假设定义了这样一个指针变量 num pointer,它被分配到4000、4001 单元,其值可通过赋值语句“ num pointer#”得到。此时,指针变量 num pointer的值就是变量num在内存中的起始地址3000,如图所示 29983000300230044000 4002 3 3000 通过指针变量 num pointer存取变量nm值的过程如下: 首先找到指针变量 num pointer的地址(4000),取出其值3000(正好是变量num的 起始地址);然后从3000、3001中取出变量num的值(3)。 (3)两种访问方式的比较 两种访问方式之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。 一种情况是,甲知道乙在何处,直接去找就是(即直接访问) 另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此时甲可以这么做:先 找丙,从丙处获得乙的去向,然后再找乙(即间接访问)
制 作:方 斌 例如,假设定义了这样一个指针变量num_pointer,它被分配到4000、4001 单元,其值可通过赋值语句“num_pointer=# ”得到。此时,指针变量 num_pointer的值就是变量num在内存中的起始地址3000,如图所示。 通过指针变量num_pointer存取变量num值的过程如下: 首先找到指针变量num_pointer的地址(4000),取出其值3000(正好是变量num 的 起始地址); 然后从3000、3001中取出变量num的值(3)。 (3)两种访问方式的比较 两种访问方式之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。 一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。 另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此时甲可以这么做:先 找丙,从丙处获得乙的去向,然后再找乙(即间接访问)。 3 2998 3000 3002 3004 3000 4000 4002
制作:方斌 再如: 内存用户数据区 整型变量i占2000、2001两个内存单元, 整型变量j占2002、2003两个内存单元, 整型变量k占2004、2005两个内存单元, 2000 2002 369 变量i 它们是整型变量,其内存单元中存放的是普 通整型数据。 变量j 2004 变量k 变量ⅰ pointe占3010、3011两个内存 单元。其中存放的数据是变量地址 3007200变量 ti pointer200—个变量占多个内存单元时,以 首地址表示该变量的地址)。这种存放另 一个变量的地址的变量称为指针变量。 称:变量ⅰ pointer指向变量i,是变量i 指针
制 作:方 斌 再如: 整型变量i占2000、2001两个内存单元, 整型变量j占2002、2003两个内存单元, 整型变量k占2004、2005两个内存单元, 它们是整型变量,其内存单元中存放的是普 通整型数据。 变量i_pointer占3010、3011两个内存 单元。其中存放的数据是变量i的地址 2000(一个变量占多个内存单元时,以 首地址表示该变量的地址)。这种存放另 一个变量的地址的变量称为指针变量。 称:变量i_pointer指向变量i,是变量i的 指针
制作:方斌 4指针与指针变量 (1)指针即地址 个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。 (2)指针变量—专门用于存储其它变量地址的变量 指针变量 num pointer的值就是变量num的地址。指针与指针变量的区 别,就是变量值与变量的区别。 (3)为表示指针变量和它指向的变量之间的关系,用指针运算符“ 表示。 例如,指针变量 num pointer与它所指向的变量nm的关系,表示为 num pointer,即* num pointer等价于变量num 因此,下面两个语句的作用相同 num=3 /*将3直接赋给变量num*/ num pointer=&num,/跸使 num pointer指向num* * num pointer-3;/*将3赋给指针变量 num pointer所指向的变量*
制 作:方 斌 4.指针与指针变量 (1)指针──即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。 (2)指针变量──专门用于存储其它变量地址的变量 指针变量num_pointer的值就是变量num的地址。指针与指针变量的区 别,就是变量值与变量的区别。 (3)为表示指针变量和它指向的变量之间的关系,用指针运算符“*” 表示。 例如,指针变量num_pointer与它所指向的变量num的关系,表示为: *num_pointer,即*num_pointer等价于变量num。 因此,下面两个语句的作用相同: num=3; /*将3直接赋给变量num*/ num_pointer=# /*使num_pointer指向num*/ *num_pointer=3; /*将3赋给指针变量num_pointer所指向的变量*/
制作:方斌 10.2变量的指针 一、指针变量的定义 指针变量有三个属性: 内存用户数据区 (1)该指针变量指向的变量的类型。如 i_ pointer指向的变量是整型。 (2)该指针变量在内存中占多少内存单元。2003变量i 如 pointer占两个内存单元,称为“近指20026变量 针”,用near表示。如果该变量在内存中占2004 变量k 4个内存单元,称为“远指针”,用far表示。 如果未指定near或far,缺省是near。(指 针变量在内存中要么占2个内存单元,要么 30107200变量 1 pointer 占4个内存单元)。 (3)该指针变量指向哪一个变量,即该指 针变量的值是多少。如 i pointer的值是 2000
制 作:方 斌 10.2 变量的指针 一、指针变量的定义 指针变量有三个属性: (1)该指针变量指向的变量的类型。如 i_pointer指向的变量i是整型。 (2)该指针变量在内存中占多少内存单元。 如i_pointer占两个内存单元,称为“近指 针”,用near表示。如果该变量在内存中占 4个内存单元,称为“远指针”,用far表示。 如果未指定near或far,缺省是near。(指 针变量在内存中要么占2个内存单元,要么 占4个内存单元)。 (3)该指针变量指向哪一个变量,即该指 针变量的值是多少。如i_pointer的值是 2000
制作:方斌 指针变量定义的一般形式: 类型标识符*标识符 表示定义指针变量 标识符”是指针变量名 “类型标识符”表示该指针变量所指向的变量类型。 例、 int L, j;/*定义两个整型变量* int *pointer_ 1, *pointer- 2i /*定义两个可以指向整型变量的指针*/ float* pointer3;/*定义一个可以指向浮点型变量的指针米 char* pointer4;/*定义一个可以指向字符型变量的指针*/ void* pointer5;/*定义一个可以指向类型变量的指针*/ char far *pointer 6 /*定义一个可以指向字符型变量的远指针占用4个字节*
制 作:方 斌 指针变量定义的一般形式: 类型标识符 * 标识符 “*”表示定义指针变量 “标识符”是指针变量名 “类型标识符”表示该指针变量所指向的变量类型。 例、 int i,j; /* 定义两个整型变量 */ int *pointer_1, *pointer_2; /*定义两个可以指向整型变量的指针 */ float *pointer_3; /*定义一个可以指向浮点型变量的指针*/ char *pointer_4; /*定义一个可以指向字符型变量的指针*/ void *pointer_5; /*定义一个可以指向类型变量的指针*/ char far *pointer_6; /*定义一个可以指向字符型变量的远指针占用4个字节*/