c语言课件指针.pptx

上传人:莉*** 文档编号:73646739 上传时间:2023-02-21 格式:PPTX 页数:76 大小:364.49KB
返回 下载 相关 举报
c语言课件指针.pptx_第1页
第1页 / 共76页
c语言课件指针.pptx_第2页
第2页 / 共76页
点击查看更多>>
资源描述

《c语言课件指针.pptx》由会员分享,可在线阅读,更多相关《c语言课件指针.pptx(76页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、地址:为了对内存中的某个存储单元进行访问,要为它编号,这种编号称为内存地址。通过地址我们就能够访问该地址所标识的存 储单元。2.地址的概念第1页/共76页变量的地址:每一个变量在内存中总占用几个连续的 字节,开始字节的地址,就是变量的地址。2007存储单元第2页/共76页10.1 10.1 指针及其相关概念 指针:一个变量的地址称为该变量的指针。许多高级语言都把程序对象的地址作为一种数据,称之为地址值或指针值。指针变量:若一个变量专用于存放另一个变量的地址(指针),则该变量称为指针变量。换句话说,以地址为值的变量称为指针变量,简称指针。第3页/共76页指针的对象:当把变量的地址存入指针变量后,

2、我们就可以说这个指针指向了该变量。变量的存取方法:直接存取和间接存取。直接存取:直接根据变量名存取数据。间接存取:通过指针变量存取相应变量的数据。第4页/共76页10.2.2 变量的指针和指向变量的指针变量一、指针变量的定义 一般形式:类型标识符*变量名;例如:int*ptr1,*ptr2;指针变量的类型:说明该指针所指向的变量的类型。在定义指针变量时要注意以下几个问题:变量名ptr2前面的“*”不能省略,如果写成 int*ptr1,ptr2;则ptr2被定义为整型变量,而非整型指针变量。第5页/共76页定义中的“*”表示所定义的变量是指针变量,但 指针变量名是ptr1、ptr2,而非*ptr

3、1、*ptr2。指针变量只能指向定义时所规定类型的变量。这个规定的类型称为该指针变量的“基类型”。如:上例中ptr1、ptr2只能指向整型变量,不 能指向实型或字符型变量。其“基类型”相同,都是整型。定义指针变量后,并未确定该变量指向何处。也就是说该变量的值是不确定的。在引用指针 变量前必须首先让它指向一个变量,这一点非 常重要。第6页/共76页二、指针变量的运算 指针运算符(“&”和“*”)“&”(取地址运算符):取变量的存储地址“*”(取值运算符):取指针所指向变量的内容 例如:&a 是求变量a的地址。ptr指向了i变量,*ptr表示i的值,即3 第7页/共76页我们还可以用这种方法实现对

4、变量的改变:*ptr=15;等价于 i=15;由此可见:通过指针运算符“*”可以引用一个变量。如:当ptr已经指向变量i后,*ptr就等同于i。第8页/共76页*ptr&i进一步理解“&”和“*”:“&”运算和“*”运算是一对互逆运算。&*ptr&i ptr *&i *ptr i等价于第9页/共76页 指针的赋值运算(=)指针的赋值运算:就是把地址赋值给指针变量。指针的赋值运算可以是以下三种方式:使用取地址运算符,把地址值赋值给指针变量。如:int i,*pi;pi=&i;把指针变量的值赋给另一个指针变量。如:int i,*pa,*pb;pa=&i;pb=pa;给指针变量赋值为符号常量NULL

5、。说明:NULL是一个空指针,表示该指针变量的值没有意义。作用是为了避免对没有被初始化的指针变量的非法引用。NULL 的定义在“stdio.h”中。如:int*pi;pi=NULL;第10页/共76页说明:在定义指针变量时,可以立即将一个地址值 赋给指针变量,这就是指针变量的初始化。指针变量的初始化也是指针的赋值运算。如:float flt,*f_ptr=&flt;注意:这不是给*f_ptr赋值。指针变量间的赋值和引用应保证基类型相同。若有定义:int*p,i;float*q,x;则:q=&i;p=&x;第11页/共76页 移动指针的运算 指针的加减运算(+、)指针的自加自减运算(+,-,+=

6、,-=)1指针的+、运算 指针整数指针指针+、说明:指针与整型值加减的结果是指针,表示使该指针指向该指针下移或上移存储单元个数(整型值)之后的内存地址。存储单元的大小就是该指针的数据类型所需的内存大小。例如:ptr+n(指针ptr,n为整数)这个指针值代表的内存单元的地址是:ptr+n*d(其中d是指针所指向变量的数据类型所占内存字节数),即指针移动了n个元素。第12页/共76页指针与指针的加运算毫无意义,所以指针与指针 没有加运算。指针与指针的减运算要求相减的两个指针属于同 一类型,其结果是整数,表示两个指针之间的数 据的个数。其结果值的计算公式是:ptr1-ptr2=(ptr1的值-ptr

7、2的值)/指针的数据类型所占的字节数 例如:int*ptr1,*ptr2,*ptr3,x;int ary5=2,4,8,16,32;ptr1=&ary0;ptr2=&ary3;ptr3=ary;x=ptr2-ptr1;x 的值是3第13页/共76页2指针的+、-、+=、-=运算+、+=:是移动指针到下一个或下几个存储单元。-、-=:是移动指针到上一个或上几个存储单元。例如:int*ptr,ary5=2,4,6,8,10;ptr=ary;ptr+=3;ptr-;想一想:*ptr+和(*ptr)+有什么区别?第14页/共76页关系运算 基类型相同的两个指针进行比较运算,其意义是两个指针的位置比较,

8、结果是逻辑值。指针运算的程序举例:把a,b按大小顺序输出。main()int*p1,*p2,*p,a,b;a=45;b=76;p1=&a;p2=&b;if(*p1*p2)p=p1;p1=p2;p2=p;printf(a=%d,b=%d,max=%d,min=%d,a,b,*p1,*p2);输出结果:a=45,b=76,max=76,min=45第15页/共76页三、指针变量作为函数参数 指针可以用作函数参数,这在调用函数希望改变参数的值时非常有用。例如:用指针变量编写实现两个数的交换的函数void swap(int*p1,int*p2);main()int x1=100,x2=200;prin

9、tf(x1=%d,x2=%dn,x1,x2);swap(&x1,&x2);printf(x1=%d,x2=%dn,x1,x2);void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;第16页/共76页图示交换过程中存储单元内容的变化:123456第17页/共76页想一想:如果函数的参数不用指针而用整型变量,能否实现值的交换?为什么?通过函数调用得到n个要改变的值的方法:在主调函数中设n个变量,用n个指针变量指向它们;将指针变量作实参,将这n个变量的地址传给所调用 的函数的形参;通过形参指针变量,改变该n个变量的值;主调函数中就可以

10、使用这些改变了值的变量。注意:不能企图通过改变指针形参的值而使指 针实参的值改变。如:上例swap函数中不能写成:temp=p1;p1=p2;p2=temp;第18页/共76页10.3 10.3 数组的指针和指向数组的指针变量 一、概念 数组的指针:是数组的起始地址。数组元素的指针:是数组元素的地址。当指针变量指向数组或数组元素时,它就是指向数组的指针变量。C规定:数组名代表数组的首地址(起始地址),也就是数组第一个元素的地址。第19页/共76页当指针变量p指向数组的某个元素时,p+1指向数组的下一个元素。假设一个整型元素占两个字节,p+1是使p的地址加2个字节。如:int a10,*p;则:

11、p=a;与 p=&a0;等价称指针变量p指向数组元素a0 p+i、a+i、&ai 都是ai的地址。第20页/共76页二、数组元素的引用 1.用下标法引用数组元素如:a3=45;b25=200;2.用指针法引用数组元素 假如:int a10,*p,i;p=a;则:*(p+i)、*(a+i)则代表元素ai *(p+i)也可以写成pi *(p+i)、*(a+i)、ai、pi 等价,都代表数组a的第i+1个元素。第21页/共76页程序举例:输出10个元素数组中的全部元素。方法二:通过数组名计算数组元素地址,找出元素的 值。main()int a10=54,65,8,2,3,56,8,21,57,98,

12、i;for(printf(n),i=0;i10;i+)printf(%4d,*(a+i);方法一:下标法。main()int a10=54,65,8,2,3,56,8,21,57,98,i;for(printf(n),i=0;i10;i+)printf(%4d,ai);第22页/共76页方法三:用指针变量指向数组元素 main()int a10=54,65,8,2,3,56,8,21,57,98,*p,i;p=a;for(printf(n),i=0;i10;i+)printf(%4d,*p+);以上三种方法,利用指针变量效率最高。说明:指针变量与数组名的区别:指针变量是地址变量,数组名是地址常

13、量。即指针变量的内容可以在程序运行过程中被改变;而数组名一旦被定义,它的地址就不能再改变了。例如:int i,*p,a6;则:p=&i;a=&i;a+;a+=i;不能给常量赋值第23页/共76页利用指针变量编程时特别要注意指针变量 的当前值。例如:通过指针变量输入输出a数组元素。main()int*p,i,a10;p=a;for(i=0;i10;i+)scanf(%d,p+);printf(“n”);for(i=0;i10;i+)printf(“%6d”,*p+);应插入语句 p=a;注意:*p+、*(p+)、(*p)+、*(+p)的含义 第24页/共76页三、数组名作函数的参数 例如:f(i

14、nt arr,int n)main()int array10;f(array,10);现在解释:实际上,能够接受并存放地址值的只能是指针变量。因此,C编译系统都是将形参数组名作为指针变量来处理的。上例中f(int arr,int n)等价于 f(int*arr,int n)。arri=*(arr+i)使用形参数组的概念只是为了与实参数组对应,直观,便于理解而已。第25页/共76页例:从10个数中找出其中最大值和最小值(用数组)。main()void max_min(int a,int n,int*max,int*min);int i,a=2,4,1,6,7,32,45,75,45,90,max

15、,min;printf(The original array=);for(i=0;i10;i+)printf(%5d,ai);max_min(a,10,&max,&min);printf(max=%d,min=%d,max,min);void max_min(int a,int n,int*max,int*min)int i;*max=*min=a0;for(i=1;in;i+)if(*maxai)*min=ai;第26页/共76页上例中如果形参数组用指针变量,则程序如下:main()void max _min(int*x,int n,int*max,int*min);int i,a10=2,

16、4,1,6,7,32,45,75,45,90,max,min;for(printf(The original array=),i=0;i10;i+)printf(%5d,ai);max_min(a,10,&max,&min);printf(“max=%d,min=%d,max,min);void max_min(int*x,int n,int*max,int*min)int i;*max=*min=*x;for(i=1;in;i+)if(*max*x)*min=*(x+i);第27页/共76页数组名做函数参数小结:如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参都可用数组名或指针

17、变量。其对应关系有以下4种情况:实参与形参都用数组名;实参用数组名,形参用指针变量;实参、形参都用指针变量;实参为指针变量,形参用数组名。注意:用指针变量作实参时一定要有确定的值。第28页/共76页例a:实参和形参都用数组名main()int a10;f(a,10);f(int x,int n)例b:实参用数组名,形参用指针变量main()int a10;f(a,10);f(int*x,int n)第29页/共76页例c:实参、形参都用指针变量main()int a10,*p;p=a;f(p,10);f(int*x,int n)例d:实参为指针变量,形参用数组名main()int a10,*p

18、;p=a;f(p,10);f(int x,int n)第30页/共76页本章程序举例:习题10.1:输入3个整数,按由小到大的顺序输出。void swap(int*p,int*q);main()int a,b,c,*p1=&a,*p2=&b,*p3=&c;scanf(“%d%d%d”,p1,p2,p3);if(*p1*p2)swap(p1,p2);if(*p1*p3)swap(p1,p3);if(*p2*p3)swap(p2,p3);printf(n%6d%6d%6d,*p1,*p2,*p3);void swap(int*p,int*q)int x;x=*p;*p=*q;*q=x;第31页/共

19、76页习题10.14:将n个数按输入时顺序的逆序排列,用 函数实现。void inverse(int*a,int n);main()int i,a10=2,4,1,6,7,32,45,75,450,89;for(puts(),i=0;i10;i+)printf(%5d,ai);inverse(a,10);for(puts(),i=0;i10;i+)printf(%5d,ai);void inverse(int*x,int n)0 1 2 3 4 5 6 7 8 9 int*i=x,*j=x+n-1,t;for(;ij;i+,j-)t=*i;*i=*j;*j=t;*i *j 第32页/共76页1

20、0.4:有N个数,使前面各数顺序向后移M个位置。main()int num20,m,n,i;printf(nm=n=);scanf(%d%d,&m,&n);for(i=0;in;i+)scanf(%d,num+i);move(num,n,m);for(i=0;in;i+)printf(%6d,*(num+i);move(int*pnum,int n,int m)int t,i,j;for(i=0;i0;j-)*(pnum+j)=*(pnum+j-1);*pnum=t;第33页/共76页作业(均要求用指针实现)(1)任意输入5个整数,按由大到小的顺序输出;(2)写一个函数 select(int

21、n,double a,double b,double x),它将数组b中大于x的数顺序复制到数组a中。a数组的内容为空,n是两个数组的大小。第34页/共76页四、二维数组的指针 1二维数组的地址概念 在C语言中,一个二维数组可以看成是一个一维数组,该一维数组中的每个元素又是一个包含若干元素的一维数组。假如有定义:int a34;则 C语 言 编 译 程 序 认 为 a数 组 是 由a0,a1,a23个元素组成的一维数组,而a0和a1,a2又分别是包含4个元素的一维数组名,分别代表a数组元素的起始地址(即a0是第0行元素的首地址,a1是第1行元素的首地址)。因此,a和ai是两个基类型不同的指针常

22、量。第35页/共76页2通过地址引用二维数组元素假如有定义:int a34,i,j;(其中0i 3,0j 4)则:ai和*(a+i)(无条件等价)都是第i行数组的首地址,也是第i行第0列(第1列)元素的地址;那么 ai+j、*(a+i)+j、&a00+4*i+j都是第i行第j列元素的地址。数组a中任意元素aij的引用可以表示成如 下几种形式:aij、*(ai+j)、*(*(a+i)+j)、(*(a+i)j、*(&a00+4*i+j)第36页/共76页二维数组的数组元素(一维数组)的首地址的运算(各班长的地址的运算)int a34首地址数组元素a(排长)a0*(a+0)a00 a01 a02 a

23、03a1*(a+1)a10 a11 a12 a13a2*(a+2)a20 a21 a22 a23排0班1班2班二维数组一维数组 班长战士第37页/共76页一维数组的数组元素及地址运算(各班战士及地址运算)0班长地址a0*(a+0)0班j战士的地址*(a+0)+j0班j战士*(*(a+0)+j)|a00 a01 a02 a03 1班长地址a1*(a+1)1班j战士的地址*(a+1)+j1班j战士*(*(a+1)+j)|a10 a11 a12 a13 2班长地址a2*(a+2)2班j战士的地址*(a+2)+j2班j战士*(*(a+2)+j)|a20 a21 a22 a23 第38页/共76页3通过

24、一个行指针变量引用二维数组的元素 定义一个由m个元素组成的一维数组的指针变量:类型标识符(*指针变量名)m;例如:假若有语句 int a34,(*p)4;p=a;注意:*p两侧的圆括号不可缺少。则:p是一个指针变量,它指向由4个整型元素组成的一 维数组。p指向a数组,p+1指向数组a的下一行首地 址,a和p的基类型相同,则a数组中任意元 素aij还可以如下表示:*(pi+j)、*(*(p+i)+j)、(*(p+i)j、pij 第39页/共76页例:使用行指针变量访问九九乘法表的数组元素。main()float fa99,(*pf)9=fa;int i,j;for(i=0;i9;i+)for(j

25、=0;j=i;j+)*(*(pf+i)+j)=(i+1)*(j+1);for(i=0;i9;i+)for(j=0;j=i;j+)printf(“%f”,faij);/或者 printf(%f,*(*(pf+i)+j);第40页/共76页习题10.9:写一函数,将一个33的矩阵转置。main()int a33=1,2,3,4,5,6,7,8,9,i,j;for(i=0;i3;i+)for(puts(),j=0;j3;j+)printf(%6d,aij);transpose(a);for(i=0;i3;i+)for(puts(),j=0;j3;j+)printf(%6d,aij);transpos

26、e(int(*p)3)int i,j,t;for(i=0;i3;i+)for(j=0;jy)z=x;else z=y;return z;第53页/共76页10.7 10.7 指针数组和指向指针的指针 一、指针数组 指针数组:就是数组中每个元素是基类型相同 指针变量。定义指针数组的一般形式:类型标识符*指针变量名常量表达式;例如:int*p2;含意:p是一个一维指针数组,每个元素都是 一个指向整型变量的指针变量。可以将 整型变量的地址赋值给元素p0或p1。注意:区别 int*p2 、int (*p)2 的含意。第54页/共76页二、指针数组的应用 1.利用指针数组处理多个字符串 方法:先用指针数

27、组指向字符数组,再处理。main()char name80=aaa,bbb,ccc,ddd,eee;char*pname10,i;for(i=0;i5;i+)pnamei=namei;for(i=0;i5;i+)puts(pnamei);main()/*与用行指针解决上述问题比较*/char name80=aaa,bbb,ccc,ddd,eee;char(*pname)80=name,i;for(i=0;i5;i+)puts(pnamei);第55页/共76页方法:用指针数组指向字符串常量。main()char *pname10=aaa,bbb,ccc,ddd,eee;int i;for(i=

28、0;i5;i+)puts(pnamei);2.用指针数组指向动态内存 void指针类型介绍:ANSI新标准增加了void指针类型,它用于定义一个指针变量,但不指定它是指向哪种类型数据。在将它的值赋给另一个指针变量时要进行强制类型转换使之适合于被赋值的变量的类型。第56页/共76页例如:char *p1;int a=2;void *p2;p2=&a;p1=(char*)p2;强制类型转换void指针变量定义 同样,可用 p2=(void*)p1;将p1的值转换成void 指针类型。可以将一个函数定义为void 指针类型。表示该函数返回的是一个地址,它指向空类型,如需要引用此地址,也需要根据情况进

29、行类型转换。如,库函数:void*malloc(unsigned size);功能:分配size字节的存储区。函数调用例:char*p;p=(char*)malloc(60);分配60字节的存储区,并返回该内存区的地址,并赋值给p。第57页/共76页void sort(char*ps,int n);#define N 5main()char*ps100,i;for(i=0;iN;i+)psi=(char*)malloc(60);for(i=0;iN;i+)gets(psi);sort(ps,N);for(i=0;iN;i+)puts(psi);void sort(char*ps,int n)i

30、nt i,k;char*p,s100;for(i=0;in-1;i+)for(k=i+1;kn;k+)if(strcmp(psi,psk)0)p=psi;psi=psk;psk=p;例:用指针数组指向动态内存,进行字符串的排序。第58页/共76页三、指向指针的指针变量 指向指针的指针变量(也称多级指针)只能存放指针变量的地址。定义形式:类型标识符 *指针变量名;例如:int*q,*p,i=5;p=&i;q=&p;5i20002000p4000q4000注意:要使用一个多级指针指向目标值,必须连续使用指针运算符“*”。例如:上例中*q就是i的值。含意:使指针变量p指向i,指针变量q指向p。第59

31、页/共76页10.8.8 指针的数据类型小结 定定 义义含含 义义 int *p;p为指向整型数据的指针变量为指向整型数据的指针变量 int *pn;定义指针数组定义指针数组p,它有,它有n n个指向整个指向整型数据的指针元素型数据的指针元素 int(*p)n;p为指向含为指向含n n个元素的一维数组的个元素的一维数组的指针变量指针变量 int *p();p为带回一个指针的函数,该指针为带回一个指针的函数,该指针指向整型数据指向整型数据 int (*p)();p为指向函数的指针,该函数返回为指向函数的指针,该函数返回一个整型值一个整型值 int *p;p是一个指针变量,它指向一个指是一个指针变

32、量,它指向一个指向整型数据的指针变量向整型数据的指针变量第60页/共76页习题10.2:输入3个字符串,按由小到大的顺序输出。void swap(char*ps1,char*ps2);main()char s1=abc,s2=rst,s3=xyz;if(strcmp(s1,s2)0)swap(s1,s2);if(strcmp(s1,s3)0)swap(s1,s3);if(strcmp(s2,s3)=A&*p=a&*p=0&*p=9)num+;else if(*p=)space+;p+;printf(n upc=%d lowc=%d num=%d space=%d,upc,lowc,num,sp

33、ace);第65页/共76页习题10.11:对10个等长的字符串排序并输出。void sort(char(*p)60);main()char s1060,i;for(i=0;i10;i+)gets(s+i);sort(s);for(i=0;i10;i+)puts(s+i);void sort(char(*p)60)int i,j;char s60;for(i=0;i9;i+)for(j=i+1;j0)strcpy(s,pi);strcpy(pi,pj);strcpy(pj,s);第66页/共76页10.12:用指针数组处理上一个题目,字符串不 等长。void sort(char*p,int n

34、);main()char *s10=AAA,DDD,878787,*ps10,i;for(i=0;i10;i+)psi=si;sort(ps,3);for(i=0;i3;i+)puts(psi);void sort(char*ps,int n)int i,j;char *s;for(i=0;in-1;i+)for(j=i+1;jn;j+)if(strcmp(psi,psj)=0&*ps0)ai+=n;n=0;if(n0)ai+=n;for(n=0;ni;n+)printf(%6d,an);第68页/共76页习题10.18:根据输入的月份输出月的英文名。main()char*month=Janu

35、ary,February,March,April,May,June,July,August,Septermber,October,Noverber,Decermber;int mon;scanf(%d,&mon);if(mon12)printf(month error!);else puts(monthmon-1);第69页/共76页作业(上机运行以下程序,要求使用指针)(1)写一函数,将一个34的矩阵转置,将数据存储到一个43的矩阵后,将两个矩阵输出;(2)输入3个字符串,按由小到大的顺序输出,要求不使用strcpy(string.h库函数)语句;(3)对n个等长的字符串排序并输出,n在21

36、0之间可变;(4)写出前述习题10.16各条语句的含义。(5)对习题10.5,写出各程序行或程序段的含义,并将“凡报到3的人退出圈子”修改为“凡报到5的人退出圈子”,上机运行该程序。第70页/共76页1.State the following statements are true or false.判断下列说法是真还是假 A)Pointer variables are declared using the address operator.指针变量用地址运算符(&)来定义。B)The underlying type of a pointer variable is void.指针变量名不能使

37、用下划线。C)Pointers to pointers is a term used to describe pointers whose contents are the address of another pointer.指向指针的指针是这样一种参数,它用于描述一种把其他指针的地址作为内容的指针。D)It is possible to cast a pointer to float as a pointer to integer.可以把float 型的指针指定为integer型的指针。第71页/共76页e)An integer can be added to a pointer.指针可以

38、与一个整数相加。f)A pointer can never be subtracted from another pointer.指针不能与指针相减。g)When an array is passed as an argument to a function,a pointer is passed.当把数组作为变量传递给一个函数时,就等于传递了一个指针。h)Pointers cannot be used as formal parameters in headers to function definition.进行函数定义时,函数头的形参不能使用指针。第72页/共76页2.Fill in t

39、he blanks in the following statements.a)A pointer variable contains as its value the _ of another variable.b)The _ operator is used with a pointer to de-reference the address contained in the pointer.c)The _ operator returns the value of the variable to which its operand points._ 操作符所返回的值是变量的操作数(变量的

40、值)所指向的值。第73页/共76页3.If m and n have been declared as integers and p1 and p2 as pointers to integers,then state errors,if any,in the following statements.a)p1=&m;b)p2=n;c)*p1=&n;d)p2=&*&me)m=p2-p1;f)p1=&p2;g)m=*p1+*p2+;4.Find the error,if any,in each of the following statements.a)int x=10;b)int*y=10;c)int a,*b=&a;d)int m;int*x=&m;第74页/共76页1.Given the following declarations:int x=10,y=10;int*p1=&x,*p2=&y;What is the value of each of the following expressions?a)(*p1)+b)-(*p2)c)*p1+(*p2)-d)+(*p2)-*p1第75页/共76页感谢您的欣赏!第76页/共76页

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

当前位置:首页 > 应用文书 > PPT文档

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁