已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 9章 指针 第 1页 第章 指针 本章概述 本章的学习目标 主要内容 第 9章 指针 第 2页 本章概述 指针是 活运用指针可使程序更加高效、简洁。 指针就是内存地址,不同于通过变量名引用内存单元的直接访问方式,使用指针可实现对内存单元的间接访问。 本章介绍指针的有关概念,介绍指针与数组的关系,介绍与函数的关系。 第 9章 指针 第 3页 本章的学习目标 本章教学目的:理解指针的概念和内存访问的关系,掌握指针的定义、引用。熟练使用指针访问基本类型的数据。理解指针与数组的关系,运用指针实现对数组的访问,包括对一维数组和二维数组处理。理解指针与字符串(字符数组)的关系,运用指针操作字符串。理解指针数组的概念,能运用指针数组处理相关的数据类型,尤其是运用字符指针数组处理多个字符串。理解指针与函数的关系,运用指针实现函数调用。理解带参数的 本章教学重点:指针的概念,指针与数组的关系。 本章教学难点:指针数组,指针与函数,多重指针。 第 9章 指针 第 4页 主要内容 指针的基本概念 指针与一维数组 指针与字符串 指针与二维数组 指针数组与多级指针的概念 指针与函数 命令行参数 程序设计举例 第 9章 指针 第 5页 内存是计算机的重要组成部分,在程序的执行过程中,所用到的数据都存于内存中。 内存单元的基本单位是字节,为方便对内存的访问,内存单元的每个字节都有一个编号, 这个编号就是内存的地址。 内存中都占用一定数量的内存单元。给变量赋值就是将数据存入对应的内存单元,使用变量时是按照变量所占用的内存单元的地址,从该地址所对应的内存单元中取出变量的值。 因为我们是通过变量的地址来找到存储变量值的内存单元,从而取得了变量的值, 所以将变量的地址又称为变量的指针 。 第 9章 指针 第 6页 如 右 图所示, 000、 2001两个字节的内存, 002、2003两个字节的内存,其内存单元中存放的是整型数据。 变量 000至 3003四 个字节的内存,其内存单元中存放的是变量 000(一个变量占多个字节的内存单元时,以首地址表示该变量的地址)。 这种存放另一个变量的地址的变量称为指针变量。称变量 i, 对一个变量的访问(访问是指取出其值或向它赋值)方式有两种: (1)直接访问 : 通过变量名访问,如通过变量名 i。 (2)间接访问 : 通过指向该变量的指针变量来访问,如通过 i。 第 9章 指针 第 7页 指针变量是一类特殊的变量,其值是一个变量的地址。既然是变量,就需要在使用之前先对其定义,然后才可以使用。 指针变量定义的一般形式: 类型标识符 * 标识符 ; 其中, 类型标识符 用于指出所定义指针变量可以指向的变量类型,称为指针变量的“ 基类型 ”, 标识符 是指针变量名, “ *” 表示定义指针变量。 第 9章 指针 第 8页 例如: * /*定义指针变量 向整型变量 */ * /*定义指针变量 向实型变量 */ * /*定义指针变量 向字符型变量 */ 指针变量定义的同时也可以对其初始化,例如: i; *p=&i; 这样定义的指针变量 p,就指向整型变量 i。 第 9章 指针 第 9页 定义指针变量时应该 注意 : (1)标识符前的“ *”只是一个符号,表示其后的变量是一个指针变量。 (2)指针变量的基类型必须与所指向的变量类型一致,否则会出错。 例如: x; x; 是错误的。 因为 变量 x 是单精度类型,数据类型不一致。 第 9章 指针 第 10页 (1) &:取地址运算符 ,用于取变量的地址。 例如: i,* i; 取 (2) *:指针运算符 ,用于访问指针变量所指向的变量。 例如: i,* i; *00; 则 *问 可以用间接方式,用 *i,语句“ *00;”与“ i=100;”相同,为 00。 第 9章 指针 第 11页 若有: i=100; &i; 则指针变量 i,对变量 ( 1)直接访问。 如 %d”,i); ( 2)通过指针变量间接访问。 如 :“%d”,* 第 9章 指针 第 12页 9. 1. 2指针变量的引用 # i,j, *p; p=&i; /*i */ i=10; %d,%dn”,i,*p); *p=100; %d,%dn”,i,*p); p=&j; *p=200; %d,%dn”,j,*p); ; 程序运行结果为: 10, 10 100, 100 200, 200 程序说明: (1)将变量 *p与 (2) 语句“ *p=100;”的作用是将 100存入由 存入整型变量 例 针变量的引用 第 9章 指针 第 13页 9. 1. 2指针变量的引用 # 2, * * p, * d, *dn”, * *n”, * c, *cn”, * ; 程序的运行结果为: 2, *2 *ch=p, *p3=p 例 出以下程序的运行结果。 程序说明: 从程序的运行结果可以看出 p1、。 第 9章 指针 第 14页 9. 1. 2指针变量的引用 # *p; ”); %d”, ”); %d”, d, dn”, * * p= p2=p; d, dn”, * ; 程序运行结果: , , 例 用指针变量求解:输入 2个整数,按从小到大顺序输出。 第 9章 指针 第 15页 程序说明: ( 1)程序中的 *即则交换指针,使 小值), 大值)。 ( 2)“ d, dn”, *” 语句,通过指针变量,间接访问变量的值。 本例的处理思路是:交换指针变量 不是交换变量 量 保持原值),最后通过指针变量输出处理结果。 例 用指针变量求解:输入 2个整数,按从小到大顺序输出。 第 9章 指针 第 16页 针与一维数组 数组和指针有密切的关系, 数组名代表数组的首地址 。 当一个指针指向数组后,对数组元素的访问,既可以使用数组下标,也可以使用指针。 用指针访问数组元素,程序的效率更高;用下标访问数组元素程序更清晰。 第 9章 指针 第 17页 向数组元素的指针 在 一个数组 组名 且它是一个地址常量,数组元素的地址可以通过数组名 a即 a+0代表数组元素 a0的地址, a+1代表数组元素 a1的地址, a+2代表数组元素 a2的地址, 。 若定义一个指针变量,使其指向一个数组,则该指针变量称为指向数组的指针变量,其定义与指向普通变量的指针变量的定义方法是一样的。 例 如: a10, *p; 则: p a; 或者: p=&a0; 上面 两个语句是等价的,都表示把数组 p。 第 9章 指针 第 18页 指针变量也可以指向数组的其它元素。例如: *a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; 此后可以赋值: &a0; &a4; 完成了赋值之后,指针 a4。 对于上面所写 &a0的表达形式,由于数组元素访问运算符 的优先级更高,所以这里不必写成 &(a0)的形式。 向数组元素的指针 第 9章 指针 第 19页 过指针引用数组元素 数组定义和初始化之后 , 数组元素可以通过数组的下标 、 数组名或指向数组的指针变量来引用 。 若定义一个一维数组: a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; 可以通过数组的下标访问数组元素:如: %d” ,a5); 也可以通过数组名访问数组元素:如: *(a+0)即 *(a)与 a0相等, *(a+1)与 a1相等, *(a+2)与 a2相等, , *(a+i)与 ai相等, 。 但使用数组名时,注意不能用 a+的方式,因为 量是不能被重新赋值的。 第 9章 指针 第 20页 同样,若定义指针变量 p( p;),并使 a(即 p=a),则可以用指针变量来访问数组元素,如右图 所示。 a0,则 p+1指向数组的下一个元素 a1, p+2指向数组元素 a2, ,p+ai , 。 可以使用 *(p+i)访问元素 ai。 p+a+i,都表示元素 ai的地址。 指向数组的指针变量也可以带下标,如 pi与 *(p+i)等价,表示元素 ai。 过指针引用数组元素 数组元素 ai的 4种 引用 方式: ai、 *(a+i)、 *(p+i)、 pi 。 引用 数组元素 ai地址的 4种方式为: &ai、 a+i、 p+i、 &pi。 第 9章 指针 第 21页 另外 , 在使用指向数组的指针变量时 , 注意对指针变量 p+1的理解 。 对于 +和 若数组元素是 p+1所表示的地址是 个字节;若数组元素是 p+1所表示的地址是 个字节;若数组元素是 p+1所表示的地址是 个字节;若数组元素是 p+1所表示的地址是 个字节 。 过指针引用数组元素 第 9章 指针 第 22页 当指针变量 p=a) 时 , 执行 p+后 , 的地址 , 再执行 p+后 , a2的地址 , 。 若数组元素是 执行 p+后 , 个字节;若数组元素是 执行 p+后 , 个字节;若数组元素是 执行 p+后 , 个字节 ( 如右图 ) 。 若 ai(i1)的地址 , 根据上面的叙述 , 读者可以思考如何理解 *p p p+1 p+2 *(*p *(p+1) *(p+2) 过指针引用数组元素 第 9章 指针 第 23页 过指针引用数组元素 a10, *p=a, i,; 0 ”); i=0; i a10, *p=a, i,; 0 ”); i=0; i。 第 9章 指针 第 26页 针使用的几个细节 2指针初始化 在定义指针变量时,可以用合法的指针值对它进行初始化。例如下面定义: n, *p = &n, *q = 执行 p+(或 p+=1)后, *p+相当于 *(p+)。因为, *和 +同优先级, +是右结合运算符。 *( p+)与 *(+p)的作用不同。 *(p+):先取 *p,再使 。 *(+p):先使 ,再取 *p。 (*p)+表示 。 3设指针 a( p=a),则有如下事实: 第 9章 指针 第 27页 针使用的几个细节 *(当于 a先取 *p,再使 。 *(+p)相当于 a+i,先使 ,再取 *p。 *(当于 a先使 ,再取 *p。 4如果 ai(p=&ai),则有如下事实: 指元素位于 指元素之后, = “is ; %sn, ; 例 用字符数组来输出一串字符。 程序运行输出: is 语言程序设计 第 9章 指针 第 30页 2. 使用字符指针 # “is %sn”, ; 程序中 语句: “is 等价于 : * “is 上面语句把字符串常量的首地址赋给指针 能理解为把字符串常量赋值给指针变量。若写成下面形式 是错误的 : *“is 符串的表现形式 例 用字符型指针来输出一串字符。 第 9章 指针 第 31页 从以上两个例子,可以看出: ( 1)字符数组和字符指针的概念不同。 ( 2)字符指针指向字符串,在 符串按数组方式处理,因此,字符数组和字符指针的访问方式相同。 符串的表现形式 例如,无论使用字符数组或是字符指针引用字符串,都可以使用% 注意 ,如果不是字符数组,而是整型、实型等数字型数组,不能用%s,只能逐个元素处理。 第 9章 指针 第 32页 符指针作函数参数 将一个字符串从一个函数传递到另一个函数,可以用字符数组名或字符指针变量作参数。有以下四种情况: 1实参和形参都为字符数组。 2实参为字符指针,形参为数组名。 3实参和形参都为字符指针变量。 4实参为数组名,形参为字符指针变量。 第 9章 指针 第 33页 例 用函数调用实现字符串的复制 # , ) i=0; i != 0) i = i; i+; i = 0; a20 = “I ; b20 = “; a =%sn b =%sn”, a,b); a,b); a =%sn b =%sn”, a,b); ; 符指针作函数参数 第 9章 指针 第 34页 参为数组名 # , ) i=0; i != 0) i = i; i+; i = 0; i; a = “I ; b = “; a =%sn b =%sn”, a,b); a,b); i=0;*(a+i)!=0; i+) (a+i); n”); i=0;*(b+i)!=0; i+) (b+i); ; 例 用函数调用实现字符串的复制 符指针作函数参数 第 9章 指针 第 35页 # *= 0; , ) * * 0; 例 用函数调用实现字符串的复制 符指针作函数参数 a = “I ; b = “; i=0;*(a+i)!=0; i+) (a+i); n”); i=0;*(b+i)!=0; i+) (b+i); n”); a,b); a); b); ; 第 9章 指针 第 36页 参为字符指针变量 # i=0; (*(i)=*(i)!= 0; i+) ; /*循环体为空语句 */ a20= “I ; b20= “; a =%sn b =%sn”, a,b); a, b); a); b); ; 程序说明:以上四种方式实现相同的功能 , 即把 不同的地方是拷贝函数参数的方式不同 。 在第四种方式中 , 语句 (*(i)=*(i)!= 0; i+) ; 的执行过程为:首先将源串中的当前字符 ,复制到目标串中;然后判断该字符是否是字符串结束标志 。 如果不是 , 则相对位置变量, 以便复制下一个字符;否则结束循环 。 其特点是:先复制 、 后判断 , 循环结束前 , 结束标志已经复制了 。 例 用函数调用实现字符串的复制 符指针作函数参数 上述四个程序的运行结果都是: a=I b=I 第 9章 指针 第 37页 符指针变量与字符数组的区别 虽然用字符指针变量和字符数组都能实现字符串的存储和处理,但二者是有区别的: ( 1)存储内容不同 字符指针变量中存储的是字符串的首地址,而字符数组中存储的是字符串本身(数组的每个元素存放一个字符)。 ( 2)赋值方式不同 对字符指针变量,可采用下面的赋值语句赋值: *is a ; 而字符数组,虽然可以在定义时初始化,但不能用赋值语句整体赋值。下面的用法是非法的: 0; is a ; /*非法用法 */ 第 9章 指针 第 38页 符指针变量与字符数组的区别 ( 3)指针变量的值是可以改变的,字符指针变量也不例外;而数组名代表数组的起始地址,是一个常量,而常量是不能被改变的。 例如: a =“ a=a+3; a); 执行后输出“ 但下面的执行后却要出错: a6=“ a=a+3;a); 因为 a=a+3是非法的。 第 9章 指针 第 39页 针与二维数组 指针可以指向一维数组,同样也可以指向二维数组,或指向更高维数组,但指向二维数组或多维数组的指针更复杂一些。 第 9章 指针 第 40页 维数组的指针 二维数组是一个由类型相同的变量构成的集合 , 其元素 以行优先顺序 存放在内存中 。 可以将二维数组看成是由几个一维数组作为元素组成的一个一维数组 。 例如下面定义的数组 a: a34=1, 2, 3,, 4, 5, 6, 7, 8, 9, 10, 11, 12; 由 12个整型变量构成 , 这 12个数组元素按行顺序存放 , 如右图所示 。 可以将 它由 a0、 a1、 a2三个数组元素组成;且 a0、a1、 a2 也是一维数组 , 长度为 。 二维数组的地址或指针可以分成两种:一种用来表示真实的数组元素的地址 , 称为 元素地址 , 也就是元素指针;另一种用来表示数组的每一行的地址 , 称为 行地址 , 也就是行指针 。 第 9章 指针 第 41页 二维数组 aij的地址或指针可以用&aij来表示 。 由于我们将二维数组看成是由几个一维数组作为元素组成的一个一维数组 ,将二维数组的每一行看成是一个一维数组 , ai是一维数组名 , 由一维数组与指针的关系知 ,元素 aij的地址或指针可以用 ai+ 语言规定数组名代表数组的首地址 。 二维数组名 a+0、 a+1、 a+2分别是下标为 0、 1、 2行的地址 , 即 以 a0、 a1、a2为一维数组名的行地址 。 即 a( a+0) 是一维数组 a0的首地址 , a+1是一维数组 a1的首地址 , a+2是一维数组 a2的首地址 , 如 右 图所示 。 维数组的指针 第 9章 指针 第 42页 如果 bi为 那么有 bi等价于 *(b+i)。 同样 , ai为 将 ai为 , 也有 ai 等价于 *(a+i)。 所以二维数组 aij的地址或指针既可以用 ai+ 也可以用*(a+i)+ 维数组的指针 综上所述,二维数组 aij的地址或指针可以表示成以下几种形式: &aij、 ai+j、 *(a+i)+j 对应地,数组元素 aij 可以表示成以下几种形式: aij、 *(ai+j)、 *(*(a+i)+j) 第 9章 指针 第 43页 指针变量 二维数组是由相同类型的一维数组作为元素而构成的一维数组 , 所谓行指针变量就是用来存放 “ 行地址 ” 的变量 。 行指针变量的定义形式如下: 类型标识符 (*行指针变量名 )数组长度 ; 注意:“ *行指针变量名”外的括号不能缺,否则成了指针数组(数组的每个元素都是一个指针)。 (*p)4; 这里( *p)是一个含有 4个元素的一维数组,是一维数组的名。因此, 第 9章 指针 第 44页 例如: (*p)4; a34=1,2,3,4,5,6,7,8,9,10,11,12; p=a; 则 个元素的一维数组的行指针变量; 行 4列的二维数组 , 即每一行相当于一个含有 4个元素的一维数组 。 二维数组名是一个行指针类型的地址常量 , 语句 “ p=a; ”的作用是将数组 p, 使行指针变量 即 a0。 指针变量 第 9章 指针 第 45页 通过行指针可以表示二维数组的首地址 、 行地址 、 元素地址 、 元素等 。 假设行指针变量 则: (1)p:等价于 a+i, 指向第 (2)p+1:等价于 a+i+1, 指向第 i+1的首地址; (3)p+: 等价于 a+i+1; (4)*p:第 个元素的地址 , 等价于 *(a+i)或 ai; (5)*p+j:第 等价于 *(a+i)+j、 ai+j或&aij; (6)*(*p+j):第 等价于 *(*(a+i)+j)、 *(ai+j)或aij。 指针变量 第 9章 指针 第 46页 例 给定二维数组任一元素的行下标和列下标,使用行指针变量输出该元素值。 # a34= 1,2,3,4,5,6,7,8,9,10,11,12; *p)4, p=a; ); %d, & ); %d, & a%d%d = %dn, *(*(p+; ; 程序运行情况: 1 2 a12 = 7 指针变量 本题也可以直接使用数组名 程序中的*(*(p+改为*(*(a+可。 第 9章 指针 第 47页 # a34=1,2,3,4,5,6,7,8,9,10,11,12; p, /*定义指针变量 p*/ p=a0; /*给指针变量 (“ ”); %d”,& ”); %d”,& a%d%d = %dn”, *(p+(+); ; 此问题也可以不使用行指针变量,而使用对二维数组元素指针的引用,达到访问二维数组的目的 ,即如下编写: 指针变量 第 9章 指针 第 48页 维数组的指针作函数参数 例 若每个学生学习 3门课程,从键盘输入 5名学生的课程成绩,计算总的平均成绩;根据给定的学生序号 (0、 1、 2、 3、 4),计算该学生 3门课程的平均成绩。 二维数组的指针同一维数组的指针一样可以作函数的参数。 第 9章 指针 第 49页 # p,n); *p)3,n); i,j,n; x; 3; n”); i=0;i #, n); /*函数声明 */ , n); /*函数声明 */ =“ “, “, “ “ ; n = 5; n); /*排序函数的调用 */ n); /*输出函数的调用 */ ; 针数组 第 9章 指针 第 54页 , n) /*选择法排序 */ i, j, k; i=0; i 0) k = j; /*比较 k与 j所对应字符串的大小 */ k != i) /*交换 i与 k的指向 */ i; i = k; k = , n) i; i=0; i # =“ “, “, “ “; *p; n; p=n=0; n *p1,* a=3,b=5; ); a=%d,b=%dn,a,b); a; b; pa, ); a=%d,b=%dn,a,b); ; *p1,* *p2= 程序运行结果为: a=3,b=5 a=5,b=3 针变量作为函数的参数 第 9章 指针 第 61页 针变量作为函数的参数 图 指针作为函数的参数 函数 a和 个程序的实现过程为: (1)主函数 a, b,如图 9.8(a)所示。 (2) 主函数 统为形参 针变量 图 9.8(b)所示。 (3)a和 果如图 9.8(c)所示。 (4)参 变量 a和 图 9.8(d)所示。 第 9章 指针 第 62页 数的指针 一个函数在编译时,被分配了一个入口地址,这个地址就称为该函数的指针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。 ( 1)定义格式为: 函数类型 (*指针变量 )(形参表列 ); 例如, * ); /* : “ *指针变量”外的括号不能缺,否则成了返回指针值的函数。 第 9章 指针 第 63页 ( 2)赋值方式 函数名代表该函数的入口地址。因此,可用函数名给指向函数的指针变量赋值。即: 指向函数的指针变量 &函数名 ; 注意: 函数名后不能带括号和参数;函数名前的“ &”符号是可选的。 例如, f(i); (*); fp=f; 语句“ fp=f;”表示将函数 而使 f。 ( 3)调用格式: (*函数指针变量 )(实参表列 ); 若使用指向函数的指针调用上面的 用语句可以是: x=(*5); 数的指针 第 9章 指针 第 64页 2通过函数指针变量来调用函数的实例 例 求 a和 x, y); ) *p)( a,b,c; p=%d,%d, &a, &b); c=(*p)(a,b); a=%d,b=%d,d,a,b,c); ; x, y) z; xy) z = x; z = y; z; 数的指针 第 9章 指针 第 65页 通过上例可以看到: ( 1)除函数名用( *指针变量名)代替外,函数指针的定义形式与函数的原型相同。例: *p) ( 仅当形参类型是 以省略形参类型,一般不要省略。 ( 2)通过函数名引用函数的指针,即函数的入口地址。语句 “ p= 把函数 p, 因此语句 “ c=(*p)(a,b); ”等价于“ c=a,b); ” , 语句中的 * 注意: 语句 “ p=中,函数名代表函数的入口地址,函数指针调用函数时,应指定实参。 ( 3) (*p)( )中的 可以先后指向不同的函数,但这些函数的返回值及参数情况应该一致。 数的指针 第 9章 指针 第 66页 3函数指针作函数的参数的实例 例 知契比雪夫多项式定义如下: 输入 n(整数 )和 x(实数 ),计算多项式的值。 (要求用函数指针作函数的参数来实现) 4n 18 3 x 1 x 数的指针 第 9章 指针 第 67页 #f1(x); /*函数声明 */ f2(x); /*函数声明 */ f3(x); /*函数声明 */ f4(x); /*函数声明 */ ) *f)(; /*函数声明 */ n; n:”); %d”,&n); n) : /*把函数 ( /*把函数 ( /*把函数 ( /*把函数 ; 数的指针 第 9章 指针 第 68页 *f)( /*函数 x, x:”); %f”,&x); *f)(x); f”, f1(x) /*函数 x; f2(x) /*函数 *x* f3(x) /*函数 *x*x*x; f4(x) /*函数 *x*x*x*x*x+1; 数的指针 第 9章 指针 第 69页 回指针值的函数 一个函数可以返回一个 可以返回一个指针类型的数据。 返回指针值的函数(简称指针函数)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年房屋买卖合同:luxury别墅交易
- 2024年式租房代理服务合同
- 生产部门月度工作总结范文(3篇)
- 2024年廉洁从业协议书:传媒行业版
- 2024年教育咨询服务与培训合同
- 专题02阅读理解100题(名校模拟地区真题)-冲刺2023年中考英语必考题型终极预测
- 2024年房地产价值评估委托书
- 2023年江苏省无锡市重点中学小升初数学自主招生考试预测卷三(A4版)
- 2023年温泉水开发利用项目评估分析报告
- 2023年工业铝材项目评估分析报告
- 君子自强不息课件
- 2022人教版高二英语新教材选择性必修全四册课文原文及翻译(英汉对照)
- WDZANYJY23低压电力电缆技术规格书
- 抗高血压药物基因检测课件
- 医院管理医院应急调配机制
- (公开课)文言文断句-完整版课件
- 小学生性教育调查问卷
- 医院感染管理质量持续改进反馈表
- 旅游行政管理第二章旅游行政管理体制课件
- 学生岗位实习家长(或法定监护人)知情同意书
- 卫生院关于召开基本公共卫生服务项目培训会的通知
评论
0/150
提交评论