C语言知识学习从基础学习到精通第8章.ppt

上传人:小** 文档编号:3687478 上传时间:2020-10-16 格式:PPT 页数:73 大小:1.26MB
返回 下载 相关 举报
C语言知识学习从基础学习到精通第8章.ppt_第1页
第1页 / 共73页
C语言知识学习从基础学习到精通第8章.ppt_第2页
第2页 / 共73页
点击查看更多>>
资源描述

《C语言知识学习从基础学习到精通第8章.ppt》由会员分享,可在线阅读,更多相关《C语言知识学习从基础学习到精通第8章.ppt(73页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、返回,第8章 指针,8.1 指针与指针变量,C语言程序设计教程,8.2 指针与函数,8.3 指针与数组,8.4 指针与字符串,8.5 指针数组于命令行参数,8.6 程序举例,8.1 指针与指针变量,8.1.1 指针的概念 1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储器,以一个字节作为存储单元,为了便于访问,给每个字节单元一个唯一的编号,第一字节单元编号为0,以后各单元按顺序连续编号,这些单元编号称为内存单元的地址 。 变量地址:变量所分配存储空间的首字节单元地址(字节单元编号)。,下一页,第8章 指针,上一页,2. 变量的三要素:名字、类型与值 每个变量都通过变量名与相应的存储

2、单元相连系,具体分配哪些单元给变量,由编译系统完成变量名到对应内存单元地址的变换。 变量分配存储空间的大小由类型决定。 变量的值则是指相应存储单元的内容。 3.内存存取方式 直接存取:把直接按变量名或地址存取变量值的方式称为 “直接存取”方式。 间接存取:通过定义一种特殊的变量专门存放内存或变量的地址,然后根据该地址值再去访问相应的存储单元 。,下一页,第8章 指针,上一页,系统为特殊变量p(用来存放地址的)分配的存储空间地址是4800,p中保存的是变量a的地址,即4000,当要读取a变量的值12345时,不是直接通过a变量,也不是直接通过保存12345的内存单元的地址4000去取值,而是先通

3、过变量p得到p的值4000,即a的地址,再根据地址4000读取它所指向单元的值12345。,这种间接的通过变量p得到变量a的地址,再存取变量a的值的方式即为“间接存取”。 通常称变量p指向变量a,变量a是变量p所指向的对象,下一页,第8章 指针,上一页,4.指针的概念,在语言中,用指针来表示一个变量指向另一个变量这样的指向关系。 所谓指针即地址。 一个变量的指针即该变量的地址,如4000就是指向变量a的指针。 指针变量:专门存放地址的变量,如p即是一个指针变量,它存放的是a的地址4000。,下一页,第8章 指针,上一页,8.1.2 指针变量的定义与初始化 1. 指针变量的定义 类型标识符 *指

4、针变量名;,在指针变量定义中,*是一个说明符,它表明其后的变量是指针变量,如p是指针变量,而不要认为“*p”是指针变量。 指针变量定义时指定的数据类型不是指针变量本身(变量存放的值)的数据类型,而是指针变量所指向的对象(或称目标)的数据类型 指针变量存放的是所指向的某个变量的地址值,而普通变量保存的是该变量本身的值 指针变量并不固定指向一个变量,可指向同类型的不同变量,下一页,第8章 指针,上一页,例:float *p1; (定义p1为指向实型变量的指针变量) char *p2; (定义p2为指向字符型变量的指针变量),(1) 指针运算符与地址运算符 与指针引用有关的两个运算符: 语句仅仅定义

5、了指针变量p,但指针变量并未指向确定的变量(或内存单元)。因为这些指针变量还没有赋给确定的地址值,只有将某一具体变量的地址赋给指针变量之后,指针变量才指向确定的变量(内存单元)。 指针变量初始化:在定义指针时同时给指针一个初始值 如: int a,*p=,下一页,第8章 指针,上一页,(3) 指针变量的引用, *指针变量名代表所指变量的值。 指针变量名代表所指变量的地址。 有定义: int a,*p= 注意:*与 float *pf; 第一行定义了整型变量a,b及指针变量pa,pb。pa、pb还没有被赋值,因此pa、pb没有指向任何变量, 下面语句完成对pa,pb的赋值: pa=,下一页,第8

6、章 指针,上一页,例如: int j,k; int *pointer1,*pointer2; pointer1=,下一页,第8章 指针,上一页,(2) 相同类型的指针变量间的赋值,pa与pb都是整型指针变量,它们间可以相互赋值,如:pb=pa; 即 pa,pb都指向变量a,此时a、*pa、*pb是等价的。指针指向变化如下图:,注意:只有相同类型的指针变量才能相互赋值,如pf=pa;是不允许的。因为pa是整型指针,pf是浮点型指针。,下一页,第8章 指针,上一页,()给指针变量赋空值,给指针变量赋空值,说明该指针不指向任何变量。 “空”指针值用NULL表示,NULL是在头文件stdio.h中预定

7、义的常量,其值为,在使用时应加上预定义行,如: #include stdio.h int *pa=NULL; 亦可以用下面的语句给指针赋“空值”: pa=0; 或: pa=0; 这里指针pa并非指向0地址单元,而是具有一个确定的“空值”,表示pa不指向任何变量。 注意:指针虽然可以赋值0,但却不能把其它的常量地址赋给指针。例如: pa=4000; 是非法的。,下一页,第8章 指针,上一页,例 8.1 指针定义与初始化,main() int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1= ,下一页,第8章 指针,上一页,程序运行结果:

8、 100,10 100,10,下一页,第8章 指针,上一页,例8.2 从键盘上输入两个整数到a、b,按由大到小输出。,#include main( ) int a,b,*pa= /* pa指向大数,pb指向小数*/ ,下一页,第8章 指针,上一页,若输入: 12 22输出结果: a=12,b=22 max=22,min=12,(b) (c) 指针变化示意图,下一页,第8章 指针,上一页,2. 指针的算术运算,(1) 加减运算: 一个指针可以加、减一个整数n,其结果与指针所指对象的数据类型有关。指针变量的值应增加或减少“nsizeof(指针类型)”。 加减运算常用于数组的处理。对指向一般数据的指

9、针,加减运算无实际意义。例如: int a10,*p=a,*x; x=p+3; /*实际上是p加上3*2个字节赋给x, x指向数组的第三个分量*/ 对于不同基类型的指针,指针变量“加上”或“减去”一个整数n所移动的字节数是不同的。例如: float a10, *p=a, *x; p=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/,下一页,第8章 指针,上一页,(2) 自增自减运算,指针变量自增、自减运算具有上述运算的特点,但有前置后置、先用后用的考虑,务请小心。 例如: int a10, *p=a, *x; x=p+/* x第一个元素分量, p指向第二个元素*

10、/ x=+p; /* x、 p均指向数组的第二个分量*/ * p+相当于*(p+ +)。 *(p+)与(*p)+ 含义不同,前者表示地址自增,后者表示当前所指向的数据自增。,下一页,第8章 指针,上一页,1.若有定义 int a,*p; 执行了“p= a=22; p= 假设变量a的地址为4000,指针p的地址为4100,二级指针pp的地址为4800。a、p、pp三者的关系如上图。,pp(4800) p(4100) a(4000),第8章 指针,上一页,返回,8.2 指针与函数,8.2.1 指针作为函数参数 利用指针作函数参数,可以实现函数之间多个数据的传递,当形参为指针变量时,其对应实参可以是

11、指针变量或存储单元地址。 函数形参为指针变量,用指针变量或变量地址作实参 例8.3 编写一个交换两个变量的函数,在主程序中 调用,实现两个变量值的交换。,下一页,第8章 指针,上一页,#include main() int a,b; int *pa,*pb; void swap(int *p1,int *p2); /*函数声明*/,scanf(%d%d, ,或:swap(,下一页,第8章 指针,上一页,程序运行结果如下: 输入: 12 22 输出: a=22,b=12,(1) 若在函数体中交换指针变量的值,实参a、b的值并不改变,指针参数亦是传值。 例如: int *p; p=p1; p1=p

12、2; p2=p; 不要希望如此完成处理。 (2) 函数中交换值时不能使用无初值的指针变量作临时变量。 例如: int *p; *p=*p1; *p1=*p2; *p2=*p; p无确定值,对 p的使用可能带来不可预期的后果。,下一页,第8章 指针,上一页,两点说明,8.2.2 指针函数,指针函数:是指返回值为指针的函数 指针函数的定义形式: 类型标示符 *函数名(参数) 例如: int *fun(int a,int b) 函数体语句 在函数体中有返回指针或地址的语句,形如: return ( 并且返回值的类型要与函数类型一致。,下一页,第8章 指针,上一页,例8.3 分析如下程序,main(

13、) int a,b,*p; int *max(int x,int y); scanf(“%d,%d”, ,int *max(int x,int y) if xy) return ( ,下一页,第8章 指针,上一页,8.2.3 指向函数的指针,一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的起始地址称为函数的入口地址 称函数入口地址为函数的指针。函数名代表函数的入口地址 可以定义一个指针变量,其值等于该函数的入口地址,指向这个函数,这样通过这个指针变量也能调用这个函数。这种指针变量称为指向函数的指针变量。 定义指向函数的指针变量的一般形式为: 类型标识符(*指针变量名)( ); 例:

14、int (*p)(); /* 指针变量p可以指向一个整型函数*/ float (*q)(); /* 指针变量q可以指向一个浮点型函数*/,下一页,第8章 指针,上一页,刚定义的指向函数的指针变量,亦象其它指针变量一样要赋以地址值才能引用。当将某个函数的入口地址赋给指向函数的指针变量,就可用该指针变量来调用所指向的函数 给函数指针赋初值:将函数名(函数的入口地址值)赋给指针变量 例如 int m, (*p)( ); int max(int a,int b); 则可以 p=max; /* p指向函数max() */ 指针调用函数的 一般形式为: (*指针变量)( 实参表); 如上例:m=(*p)(

15、12,22); /*比较 m=max(12,22); */,下一页,第8章 指针,上一页,用函数指针调用函数是间接调用,没有参数类型说明,C编译系统也无法进行类型检查,因此,在使用这种形式调用函数时要特别小心。实参一定要和指针所指函数的形参类型一致。 函数指针可以作为函数参数,此时,当函数指针每次指向不同的函数时,可执行不同的函数来完成不同的功能,下一页,第8章 指针,上一页,注意,例 8.4 函数max()用来求一维数组的元素的最大值,在主调函数中用函数名调用该函数与用函数指针调用该函数来实现。,下一页,第8章 指针,上一页,#include stdio.h #define M 8 main

16、() float sumf,sump; float aM=11,2,-3,4.5,5,69,7,80; float (*p)(); /*定义指向函数的指针p*/ float max(float a ,int n); /*函数声明*/ p=max; /*函数名(函数入口地址)赋给指针p*/,sump=(*p)(a,M); /*用指针方式调用函数*/ sumf=max(a,M); /*用函数名调用max()函数*/ printf(sump=%.2fn,sump); printf(sumf=%.2fn,sumf); float max(float a,int n) int k; float s; s

17、=a0; for (k=0;kn;k+) if (sak) s=ak; return s; ,下一页,第8章 指针,上一页,程序运行结果: sump=80.00 sumf=80.00,(1) 定义一个指向函数的指针变量,形如: float (*p)(); (2) 为函数指针赋值,格式如下: p=函数名; 注意:赋值时只需给出函数名,不要带参数。 (3) 通过函数指针调用函数,调用格式如下: s=(*p)(实参);,第8章 指针,上一页,指向函数的指针的使用步骤,返回,8.3 指针与数组,8.3.1 指向一维数组的指针 数组名是一个常量指针,它的值为该数组的首地址 1.指向数组的指针的定义方法与

18、指向基本类型变量的指针的定义方法相同,例如: int a10=1,3,5,7,9; int *p; p= (把数组的首地址赋给指针变量p),下一页,第8章 指针,上一页,C语言规定:数组名代表数组首地址,是一个地址常量。 因此,下面两个语句等价: p=,下一页,第8章 指针,上一页,在定义指针变量的同时可赋初值: int a10, *p= 两句,指向数组的指针变量p,下一页,第8章 指针,上一页,2.通过指针引用数组元素 *p=5; 表示对p当前所指的数组元素赋以一个值5。 C规定:p+1指向数组的下一元素(而不是将p值简单地加1)。p+1意味着使p的原值(地址)加d个字节(d为一个数组元素所

19、占的字节数)。,如果p的初值为 int i; for (i=0;i10;i+) scanf(%d, ,(2)通过数组名计算数组元素地址,输出元素的值,下一页,第8章 指针,上一页,main() int a10; int i; for (i=0;i10;i+) scanf(%d, ,三种方法的比较: 用下标法比较直观,能直接知道是第几个元素; 而用指针法则执行效率更高。,下一页,第8章 指针,上一页,(3)用指针变量指向数组元素,main() int a10; int *p,i; for (i=0;i10;i+) scanf(%d, ,使用指针变量时,应注意: (1)指针变量可实现使本身的值改变

20、。 P+合法;但a+不合法(a是数组名,代表数组首地址,在程序运行中是固定不变的。) (2)要注意指针变量的当前值。,main() int a10; int *p, i; p=a; for ( ;pa+10;p+) scanf(%d,p); printf(n); for ( ;p(a+10);p+) printf(%d, *p ); ,不能 (4) *(p+)与*(+p)意义不同,后者是先p=p+1,再获得p指向的变量值。 若p=a,则输出*(p+)是先输出a0,再让p指向a;输出*(+p)是先使p指向a,再输出p所指的a。 (5)(*p)+表示的是将p指向的变量值+,8.3.2 二维数组与多

21、维数组的指针表示法,1.二维数组的地址 设有一个二维数 组a,它有三行四列: int a34; 数组名a: 代表整个二维数组的首地址,也就是第0行的首地址。 a+i: 代表第i行的首地址。(见下页图),下一页,第8章 指针,上一页,数组名a代表整个二维数组的首地址:,上图 a数组包含三个元素:a0,a1,a2. 而每个元素又是一个一维数组,它包含4个元素(即4个列元素),如:a0又包含:a00,a01,a02,a03.,下一页,第8章 指针,上一页,一维数组名ai: 代表第i 行的首地址,即第i行中第0列元素的地址(既 int k,j,*p; for (j=0;j2;j+) /* 方式1 */

22、 for (k=0;k3;k+) printf(%5d,*(aj+k); /* aj是j行首地址,aj+k是j行k列元素的地址*/ putchar(n); putchar(n);,下一页,第8章 指针,上一页,for (j=0;j2;j+) /* 方式2 */ for (k=0;k3;k+) printf(%5d,*(*(a+j)+k); /* *(a+j)是j行首地址,*(a+j)+k是j行k列元素的地址*/ putchar(n); p=a; /* p指向数组的第一个元素 */ for (j=0;j2;j+) /* 方式3 */ for (k=0;k3;k+) printf(%5d,*(p+

23、); /* 输出p所指示的元素 */ putchar(n); ,下一页,第8章 指针,上一页,输出的结果是: 0 3 4 5 0 3 4 5 0 3 4 5,下一页,第8章 指针,上一页,2.指向二维数组的指针变量 有两种情况:一是直接指向数组元素的指针变量; 二是指向一个含有m个元素的一维数组。 这两种不同形式的指针变量,其使用方法不同。 指向数组元素的指针变量,即简单指针变量,如: int *p,a34; p=,下一页,第8章 指针,上一页,(1)int (*p)4; 定义一个指针变量p ,p 指向包含4个元素的一维数组。 (2)p+i与 *(p+i)的区别: p+i是指向第i行的指针(第

24、i行的首地址); *(p+i)是指向第i行第1个元素的地址; 两者数值相等,但含义不同:p+i 的增值将以行长为单位,而*(p+i)增值将以元素长度为单位。,下一页,第8章 指针,上一页,注意,即:p+i+1将指向第i行再下一行的首地址,而*(p+i)+1将指向第i行首元素的下一个元素地址。(见下图) 设 int a34,(*p)4; p=a;,如果p先指向a0,则p+1不是指向a01,而是指向a1,下一页,第8章 指针,上一页,例8.7 main( ) static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4,i,j; p=a; sca

25、nf(i=%d,j=%d, ,第8章 指针,上一页,返回,8.4 指针与字符串,8.4.1 字符串的指针表示法 回顾:字符串可以保存在字符数组中,如。 main( ) static char string =I Love China!; printf(%sn,string); 运行时输出:I Love China!,下一页,第8章 指针,上一页,用字符指针指向字符串: 字符指针变量的定义:char *指针变量 ; 如:char *p; (1) 在定义时初始化指针变量使指针指向一个字符串。 main( ) char *string=“I Love China!” ; (初始化string) pr

26、intf( %sn, string ); 运行时也输出: I Love China!,下一页,第8章 指针,上一页,char *str =“I love china”,str140; 等价于下列两句:char *str ; str=“I love china” ; 以上语句的含义: 定义str为指针变量,它指向字符型数据,且赋值语句把字符串“I love china ”的首地址赋给了指针变量str。 对字符串的整体输出实际上还是从指针所指示的字符开始逐个显示(系统在输出一个字符后自动执行p+),直到遇到字符串结束标志符0为止。而在输入时,亦是将字符串的各字符自动顺序存储在p指示的存储区中,并在

27、最后自动加上 0。,Str1=“I love china”; ?,下一页,第8章 指针,上一页,(2)用指针变量来实现对字符串的访问例8. 8 将一已知字符串第n个字符开始的剩余字符复制到另一字符串中。,main() int i,n; char a=computer; char b10,*p,*q; p=a; q=b; scanf(%d, /*指针指到要复制的第一个字符 */,下一页,第8章 指针,上一页,for (;*p!=0;p+,q+) *q=*p; *q=0; /* 字符串以0 结尾 */ printf(String a : %sn,a); printf(String b : %sn,

28、b); ,输入: 3 输出: computer mputer 考虑一下,若输出语句改为如下语句会如何? printf(“string a is :%sn”,p); printf(“string b is %sn”,q);,下一页,第8章 指针,上一页,8.4.2 字符串数组 字符串数组:是指数组中的每个元素都是一个存 放字符串的数组。 字符串数组可以用一个二维字符数组来存储。 例如:char languge3 10; 数组的第一个下标决定字符串的个数,第二个下标是字符串的最大长度(实际最多9个字符,0占一位置)。 可以对字符串数组赋初值。例如: Char languge3 10;=“Basic

29、”, “c+”, “pascal”,第8章 指针,上一页,返回,8.5.1 指针数组 指针数组:是指针变量的集合。即它的每一个元素都是指针变量,且都具有相同的存储类别和指向相同的数据类型。 指针数组的定义形式为: 类型标识符 *数组名数组长度说明; 例如: int *p10; 由于 比*的优先级高,因此p先与 10结合成p10,而p10正是数组的定义形式,共有10个元素。最后p10与*结合,表示它的各元素可以指向一个整型变量。,下一页,第8章 指针,上一页,8.5 指针数组与命令行参数,指针数组广泛应用于对字符串的处理 例如有定义: char *p3; 定义了一个具有三个元素p0,p1,p2的

30、指针数组。每个元素都可以指向一个字符数组,或字符串。 若利用数组初始化,则: char *p3= “Basic”, “c+”, “pascal”; P0指向字符串“Basic”; P0指向字符串“c+”; P0指向字符串“pascal” ;,下一页,第8章 指针,上一页,例8.9 字符指针数组的赋值 #define NULL 0 main( ) static char a =“Fortran”; static char b =“COBOL”; static char c =“Pascal”; int i; char *p4; p0=a; p1=b; p2=c; p3=NULL; for (i=

31、0;pi!=NULL;i+) printf(“Language %d is %sn”,i+1,pi); ,下一页,第8章 指针,上一页,例8.10 有若干本书,将书名按字典顺序排序,#include #include main() char *bname=Programming in ANSI C,BASIC,Visual C+ 6.0 Programming ,TRUBO C 2.0; int i,m; void sort(char *name,int); m=sizeof(bname)/sizeof(char *); /*字符串个数*/ sort(bname,m); /* 排序,改变指针的

32、连接关系*/ printf(n); for (i=0;im;i+) /* 输出排序结果*/ printf(%8s,bnamei); ,下一页,第8章 指针,上一页,void sort(char *name, int n) /*选择排序*/char *t; int i,j,k; /* k记录每趟最小值下标 */ for (i=0;i0) k=j; /* 第j个元素更小*/if (k!=i) /* 最小元素是该趟的第一个元素 则不需交换 */ t=namei;namei=namek;namek=t; ,输出结果为: BASIC Programming in ANSI C TRUBO C 2.0 V

33、isual C+ 6.0 Programming,下一页,第8章 指针,上一页,(1)字符数组中每个元素可存放一个字符,而字符指针变量存放字符串首地址,而不是存放在字符指针变量中。 (2)对字符数组,与普通数组一样,不能对其进行整体赋值,只能给各个元素赋值,而字符指针变量可以直接用字符串常量赋值。例如,若有如下定义: char a10; char *p;则语句 a=”computer”;是非法的,因为数组名a是一个常量指针,不能对其赋值。只能对各个元素分别赋值: a0=c;a1=o;a2=m;a3=p;a7=r;但语句: p=”computer”; 是合法的。,下一页,第8章 指针,上一页,注

34、意,8.5.2 指针数组与命令行参数,在操作系统命令状态下,可以输入程序或命令使其运行,称命令行状态。输入的命令(或运行程序)及该命令(或程序)所需的参数称为命令行参数。 如: copy fd fs copy是文件拷贝命令,fd、fs是命令行参数。 main函数是可以有参数的,但与普通函数不同。 带形参的main( )函数的一般形式是: main (int argc, char *argv ) 形参argc记录命令行中字符串的个数,argv是一个字符型指针数组,每一个元素顺序指向命令行中的一个字符串。,下一页,第8章 指针,上一页,1.main()函数的形参与实参,main()函数由系统自动调

35、用,而不是被程序内部的其它函数调用, main()函数所需的实参不可能由程序内部得到,而是由系统传送。 main()函数所需的实参与形参的传递方式也与一般函数的参数传递不同,实参是在命令行与程序名一同输入,程序名和各实际参数之间都用空格分隔。 格式为:执行程序名 参数1 参数2 参数n 形参argc为命令行中参数的个数(包括执行程序名),其值大于或等于1,而不是象普通C语言函数一样接受第一个实参。 形参argv是一个指针数组,其元素依次指向命令行中以空格分开的各字符串。 即:第一个指针argv0指向程序名字符串,argv1指向参数1,argv2指向参数2,.,argvn 指向参数n。,下一页,

36、第8章 指针,上一页,2.命令行参数的传递示例例8.11 分析下列程序,指出其执行结果,该程序命名为exam.c,经编译连接后生成的可执行程序为exam.exe,#include main (int argc , char * argv ) int i=0; printf(“argc=%dn”,argc); while (argc =1) printf(“n参数%d:%s”,i,*argv); i+; argc-;argv+; ,下一页,第8章 指针,上一页,输出结果: argc=4 参数0:exam 参数1:Turbo_c 参数2:C+ 参数3:Vc 程序开始运行后,系统将命令行中字符串个数

37、送argc,将四个字符串实参:exam、Turbo_c、C+、Vc的首地址分别传给字符指针数组元素argv0、argv1、argv2、argv3。,若运行该程序时的命令行输入的是: exam Turbo_c C+ Vc,第8章 指针,上一页,返回,8.6 程序举例,分析: 将十进制数n转换成r进制数的方法是:n除以r取余数作为转换后的数的最低位。若商不为0,则商继续除以r,取余数作为次低位,以此类推,直到商为0为止。 对于十六进制数中大于9的六个数字是用A,B,C,D,E,F来表示。 所得余数序列转换成字符保存在字符数组a中。,下一页,第8章 指针,上一页,例8.12 输入一个十进制正整数,将其转换成二进制、八进制、十六进制数输出,(4)字符0的ascii码是48,故余数09只要加上48就变成字符09了;余数中大于9的数1015要转换成字母,加上55就转换成A、B、C、D、E、F了。 (5)由于求得的余数序列是低位到高位,而屏幕显示先显示高位,所以输出数组a时要反向进行。,第8章 指针,上一页,点击,查看程序请,输入:Input radix(2,8,16):16 Input a positive integer:435678 输出:6A5DE,运行,返回,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com