c语言程序设计10-指针_第1页
c语言程序设计10-指针_第2页
c语言程序设计10-指针_第3页
c语言程序设计10-指针_第4页
c语言程序设计10-指针_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c语言程序设计10-指针c语言程序设计10-指针 101 指针的概念 简单地说,指针就是地址。 要掌握指针的概念就必须弄清: 内存地址概念? 变量与地址的关系? 如何通过地址进行变量的存取? 101 指针的概念说明例: 内存用户数据 1000 3 i 1002 6 j 1004 9 k对变量值的存取总是按地址进行的-直接访问。int i,j,k;i=3; j=6;k=i+j;程序经编译后,变量名就不复存在,以地址对应。说明例:int i,j,k;程序经编译后,变量名就不复存在也可以采用“间接访问”方式: 先将变量i的地址存放到另一变量p1中,要访问i时,先取出p1的内容(变量i的地址),再去访

2、问该地址所对应的内存单元中的内容(变量i的值)。c语言程序设计10-指针 内存用户数据 1000 3 i 1002 6 j 1004 9 k 2000 1000 p1 2004 1002 p2int i,j,k;i=3; j=6;k=i+j;int *p1, *p2;p1=&i;p2=&j; int 在以上概念的基础上对指针下定义: 变量的地址就是该变量的指针。 存放地址的变量称指针变量。 若p1存放了变量i的地址, 则称p1是指向变量i的指针变量。10001002100410001002ijkp1p2369int i,j,k;i=3; j=6;k=i+j;int *p1, *p2;p1=&i

3、;p2=&j;10001002100410001002ijkp1p2369 102 变量的指针和指向变量的指针变量 变量的指针 指针变量 指向变量的指针变量 用“*”代表“指向” 如*p1代表它所指向的变量i,同一内存单元。 以下两个语句等价: i=3; 直接访问 *p1=3; 间接访问int i,*p1;p1=&i; 102 变量的指针和指向变量的指针变量 内存用户数据 1000 3 i 1002 6 j 1004 9 k 2002 1000 p1 2004 1002 p2int i,j,k;i=3; j=6;k=i+j;int *p1, *p2;p1=&i;p2=&j;*p1=5;*p2=

4、8;58int i,j,k;58 指针变量的定义 指针变量也必须先定义后使用。 int *p1;注意: *表示该变量为指针变量,但变量名是p1。 一个指针变量只能指向同一类型的变量。 int i,*p1; float a; p1=&i; 合法 p1=&a; 不合法 指针变量的定义 指针变量的引用 两种用法: 用地址运算符& p1=&i; 用指针运算符* (实行间接访问) *p1=100; k=*p1; 注意: 指针变量只能放地址(指针)。 p1=100; 不允许 使用指针运算符*之前,p1必须被赋值(即p1必须存放了某个变量的地址) 指针变量的引用例: T10-1.c 注意:要区别定义和引用中

5、的“*”main() int a=100,b=10; int *p1,*p2; 定义指针变量,尚无体指向 p1=&a; p1指向a p2=&b; p2指向b printf(“*p1=%d, *p2=%d n”, *p1, *p2); printf(“&a=%x,& b=%x n”,&a, &b); printf(“p1=%x, p2=%x n”, p1, p2); printf(“& p1=%x, &p2=%x n”, &p1, & p2);运算结果:*p1=100, *p2=10&a=12ff7c,& b=12ff78p1=12ff7c, p2=12ff78&p1=12ff74, &p2=1

6、2ff70例: T10-1.c 注意:要区别定义和引用中的“*”运要特别注意以下用法的后果:egp1.c int *p1; *p1=100;c语言程序设计10-指针例:输入a和b两个整数,按先大后小的顺序输出 main() T10-2.c int a,b,*p1, *p2, *p; scanf(“%d,%d”,&a,&b); 1000 5 a p1=&a; p2=&b; 1002 9 b if(ab) p=p1; p1=p2; p2=p; printf(“n %d,%d”,a,b); 2000 p1 printf(“n%d,%d”,*p1,*p2); 2004 p2 2006 p 改变p1和p

7、2的指向10001002100210001000例:输入a和b两个整数,按先大后小的顺序输出 main重要概念: 只要将某一变量的地址存入指针变量中,就可通过指针变量间接访问该变量。 配钥匙!c语言程序设计10-指针swap(int p1, int p2) int t; t=p1; p1=p2; p2=t; 1000 5 a 1002 9 b main() int a,b; scanf(“%d,%d”,&a,&b); 2000 p1 if(ab)swap(a, b); 2004 p2 printf(“n %d,%d”,a,b); 2006 t T10-3-1.c59595例 不用指针变量作函数

8、参数,将两个整数按大小顺序输出。怎样直接修改a、b的值呢?修改原件用指针!swap(int p1, int p2)59595例 指针变量作为函数的参数 可将指针变量作函数的参数,接受实参地址,获得具体指向,进而通过指针变量间接访问主调函数的变量。 指针变量作为函数的参数例T10-3.c用指针变量作函数参数,将两个整数按大小顺序输出。swap(int *p1, int *p2) int t; t=*p1; *p1=*p2; *p2=t; 1000 5 a 1002 9 b main() int a,b; scanf(“%d,%d”,&a,&b); 2000 p1 if(ab)swap(&a,&b

9、); 2004 p2 printf(“n %d,%d”,a,b); 2006 t 10001002595例T10-3.c用指针变量作函数参数,将两个整数按大小顺序输 重要概念:使用指针变量作函数参数,被调函数可以将多个结果交给主调函数。 数组名做参数,可返回该数组所有元素 还记得那个求成绩最高、最低和平均值的例子?还需要用全局变量吗?c语言程序设计10-指针例T10-4-2.c :求n个数的最大值、最小值和平均值。float aver(int a, int n, int *max, int *min) int i; float s=0; *max=a0; *min=a0; for(i=0;i*

10、max) *max=ai; if(ai*min) *min=ai; return(s/100);main() int a100,i,max,min;float av;for(i=0;i100;i+) scanf(“%d”,&ai);av=aver(a,100,&max,&min);printf(“ %d,%d,%f”,max,min,av);例T10-4-2.c :求n个数的最大值、最小值和平均值。m例T10-4-1.c :编写函数,求一元二次方程的两个实根。#include “math.h” ? root(float a,float b,float c, ) float d; d=b*b-4

11、*a*c; if(d0|a=0)return(0); ? =(-b+sqrt(d)/2/a; ? =(-b-sqrt(d)/2/a; return(1); float *x1, float *x2 *x1 *x2 int main() int k; float a,b,c,x1,x2; scanf(“%f,%f,%f”,&a,&b,&c); k=root(a,b,c,&x1,&x2); if(k) printf(“n %f,%f”,x1,x2); 输入:1, -10 ,25输出:5.000000,5.000000函数参数:如不需改变(只读):一般参数如需改变(读写):指数参数例T10-4-1.

12、c :编写函数,求一元二次方程的两个实根。 103 数组的指针和指向数组的指针变量数组有一个首地址: 数组的指针。每个数组元素也都有地址: 数组元素的指针。532168742000200220042006 103 数组的指针和指向数组的指针变量5321687 指向数组元素的指针变量 int a10,*p; p=a; 指向数组 p=&a0; 指向数组元素 51247680392000200220042006p 指向数组元素的指针变量51247680392000 通过指针引用数组元素 int a10,*p; p=&a0; 或者 p=a; /p指向a0 *p=1; 等效于a0=1; 即可通过p来访问

13、a0也可以通过p来访问其它元素: *(p+1)=3; 等效于a1=3; 其中p+1指向a1注意:p+1不是地址加1,而是加一个数据类型单位。 通过指针引用数组元素一般地,当p指向a0时,即p=&a0; 或者 p=a; p+i a+i &ai*(p+i) *(a+i) ai pi即以下几个语句等效:ai=10; *(p+i)=10; *(a+i)=10; pi=10;c语言程序设计10-指针举例:用三种方法输出数组元素例T10-5-1.c 用“数组名+下标”的方法main()int i, a5;for(i=0; i5; i+) scanf(“%d”,&ai);for(i=0; i5; i+)pr

14、intf(“&a%d=%x, a%d=%d n”, i,&ai, i, ai );输入: 55 66 77 88 99 输出: &a0=ffce, a0=55 &a1=ffd0, a1=66 &a2=ffd2, a2=77 &a3=ffd4, a3=88 &a4=ffd6, a4=99 ffcc 55 a0ffce 66 a1ffd0 77 a2ffd2 88 a3ffd4 99 a4ffd6 a5举例:用三种方法输出数组元素输出:ffcc 举例:用三种方法输出数组元素例T10-5-2.c 计算“数组名计算地址”的方法main() int i, a5; for(i=0;i5;i+) scanf

15、(“%d”,a+i); for(i=0;i5;i+)printf(“a+%d)=%x,*(a+%d)=%d n”,i,(a+i), i,*(a+i);输出: (a+0)=ffcc, *(a+0)=55 (a+1)=ffce, *(a+1)=66 (a+2)=ffd0, *(a+2)=77 (a+3)=ffd2, *(a+3)=88 (a+4)=ffd4, *(a+4)=99 ffcc 55 a0ffce 66 a1ffd0 77 a2ffd2 88 a3ffd4 99 a4ffd6 a5举例:用三种方法输出数组元素输出:ffcc 举例:用三种方法输出数组元素例T10-5-3_new.c 用“指

16、针变量+下标”的方法(指针法I )main()int *p, a5,i; p=a;for(i=0;i5;i+) scanf(“%d”,p+i);for(i=0;i5;i+)printf(&p%d=%x, p%d=%d, *(p+%d)=%dn,i,&pi,i,pi,i,*(p+i);12ff6c 55 p012ff70 66 p112ff74 77 p212ff78 88 p312ff7c 99 p4输出:&p0=12ff6c, p0=55, *(p+0)=55&p1=12ff70, p1=66, *(p+1)=66&p2=12ff74, p2=77, *(p+2)=77&p3=12ff78,

17、 p3=88, *(p+3)=88&p4=12ff7c, p4=99, *(p+4)=99举例:用三种方法输出数组元素12ff6c 55 举例:用三种方法输出数组元素(例T10-5-4_new.c )用“指针变量指向数组元素”法(指针法II)main()int *p, a5; for(p=a; p (a+5); p+)scanf(“%d”,p+i); for(p=a; p (a+5); p+)printf(“p=%x, *p=%d n”, p,*p);输出:p=12ff6c,*p=55p=12ff70,*p=66p=12ff74,*p=77p=12ff78,*p=88p=12ff7c,*p=9

18、912ff6c 55 a012ff70 66 a112ff74 77 a212ff78 88 a312ff7c 99 a4p+: 合法, 因p是指针变量,而变量可以用 +运算符的a+: 不合法, 因为a是数组名,其值是数组元素的首地址,分配之后不可变。举例:用三种方法输出数组元素(例T10-5-4_new.c 举例:用三种方法输出数组元素(例T10-5-4.c )指针变量当作数组名使用(混合指针法) main() int a5,*p=a,i; for(p=a;pa+5;p+) scanf(“%d”,p); p=a;/不能漏! for(i=0;i5;i+) printf(“&p%d=%x,p%d

19、=%d,*(p+%d)=%dn”, i,&pi, i,pi,i,*(p+i); 输出:&p0=12ff6c,p0=55,*(p+0)=55&p1=12ff70,p1=66,*(p+1)=66&p2=12ff74,p2=77,*(p+2)=77&p3=12ff78,p3=88,*(p+3)=88&p4=12ff7c,p4=99,*(p+4)=9912ff6c 55 p12ff70 66 p+112ff74 77 p+212ff78 88 p+312ff7c 99 p+4举例:用三种方法输出数组元素(例T10-5-4.c )输出:通过指针引用数组元素的方法小结例:累加求和的各种用法:int *p,

20、a10;s=0;p=a;for(i=0;i10;i+)s+=ai;for(i=0;i10;i+)s+=*(a+i);for(i=0;i10;i+)s+=*(p+i);for(i=0;i10;i+)s+=pi;for(i=0;i10;i+)s+=*p+; for(p=a;pa+10;p+)s+=*p; 最后一种用法效率高。数组元素地址法指针法I指针变量指向数组元素指针法II指针变量当作数组名注意不能使用a+通过指针引用数组元素的方法小结数组元素地址法指针法I指针法I指针变量使用时的几个问题, 若p当前指向a数组的第i个元素,则:10-plus.c *p:是取出ai的值. p + :指针指向ai+

21、1. *p+ :等价于*(p+)及ai+ ,优先级同为2,从右向左结合,将 ai 的值取出, 后再使 p增1(不是单纯的加一,是p指向ai+1). * (+p):与a+i等价,先将p指向ai+1,然后将该元素取出. (*p)+:将p所指的数组元素ai的值取出,使ai的值增1. p- :指针指向ai-1. *(p-):与ai-等价, 将p 所指向的第i个数组元素取出,然后使p指向i-1元素. *(-p):与a- i等价,先将p减1指向第i-1个元素,然后将其取出. (*p)-:将p所指的数组元素ai的值取出,使ai的值减1.指针变量使用时的几个问题, 数组名作为函数参数 有了指针概念的基础上,重

22、新回顾数组名作为函数参数时,数据的传递情况:void sort(int a, int n)void sort(int *a, int n)数组名作为函数参数 例:选择法排序函数 void sort(int *a, int n)例T10-7-1.c int i,j,t; for(i=0;in-1;i+) for(j=i+1;jaj)t=ai; ai=aj; aj=t; 只将形参改为指针变量,仍按下标法使用 void sort(int *a, int n) int i,j,t; for(i=0;in-1;i+) for(j=i+1;j*(a+j) t=*(a+i); *(a+i)= *(a+j);

23、 *(a+j)=t; 按指针法使用例T10-7-2.c 例:选择法排序函数 void sort(int *a进一步优化:都用指针,效率更高! (例T10-7-3.c )void sort(int *a, int n) int *i, *j,t; for(i=a;ia+n-1;i+) for(j=i+1;j*j) t=*i; *i=*j; *j=t; main() int a10,j; for(j=0;j10;j+)scanf(“%d”,a+j); sort(a,10); for(j=0;j10;j+)printf(“%5d”,aj); 进一步优化:都用指针,效率更高! (例T10-7-3.c

24、分段排序?例T10-7-4.c main() int a10,j; for(j=0;j10;j+)scanf(“%d”,a+j); for(j=0;j10;j+)printf(“%5d”,aj); sort(a,5);sort(a+5,5);void sort(int *a, int n) int *i, *j,t; for(i=a;ia+n-1;i+) for(j=i+1;j*j) t=*i; *i=*j; *j=t; 分段排序?例T10-7-4.c sort(a,5);sort 指向多维数组的指针和指针变量 从本质上说,多维数组的指针与一维数组的指针相同,但在概念上和使用上,多维数组的指针

25、要复杂些。 以二维数组的指针为例: 指向多维数组的指针和指针变量 二维数组的地址 :一维:a,&ai,a+i 二维:aa+i (行指针:指向第i行)ai *(a+i) (特殊的一维数组,列指针,指向行中的列)ai+j *(a+i)+j &aij int a34 1357911131517192123100010081016a+0a+1a+2a0讨论以下用法的效果:T10-8-1.cfor(i=0;i3;i+) scanf(“%d”,a+i);输入数据:1 2 3讨论以下用法的效果:T10-8-2.cfor(i=0;i3;i+) scanf(“%d”,a1+i);输入数据:1 2 3讨论以下用法

26、的效果:T10-8-3.cfor(i=0;i3;i+) scanf(“%d”,a1+i+2);输入数据:1 2 3讨论以下用法的效果:T10-8-4.cfor(i=0;i3;i+) scanf(“%d”,a+i+1);输入数据:1 2 3a0+1a0+2a0+3二维数组的地址 :int a34 1357911一维数组与二维数组的比较第i个一维数组的第j个元素的地址无意义*(a+i)+j第i个一维数组的第j个元素的值无意义*(*(a+i)+j)第i个一维数组的值第i个一维数组的首地址第i个元素的值*(a+i)第i个元素 的地址一维数组第i个元素的地址a+i二维数组的首地址一维数组的首地址a二维数

27、组一维数组一维数组与二维数组的比较第i个一维数组的第j个元素的地址无意注意:指针运算符*作用在行指针上的结果仍是指针-列指针; *作用在列指针上的结果-具体元素。 *(a+0),*(a+1),*(a+2) 仍是地址。*(a+i) ai *(a0),*(a1),*(a1) 具体元素值。*(ai)*(a+i)+j 也是地址,但要区别: (a+i)+j行指针 (a+1)+1 ? *(a+i)+j列指针 *(a+1)+1 ? 100010081016a+0a+1a+2a0a1a2*(a+1)1357911131517192123注意:100010081016a+0a+1a+2a0a 如果要通过a+i形

28、式的地址访问数组元素的具体内容,则:*(*(a+i) 或 *(*(a+i)+j)如:*(*(a+1) a10 *(*(a+1)+2) a12讨论:例T10-8-5.c*(a+2) *(*(a+1)+3) *(a1+1) *(*(a+1)+5)123456789111012 如果要通过a+i形式的地址访问数组元素的具体内容,则:1例:求数组a的所有元素之和。 可有多种用法:例T10-9-1.cT10-9-3.c M行N列for(i=0;iM;i+) for(i=0;iM;i+)for(j=0;jN;j+) for(j=0;jN;j+)s+=aij; s+=*(ai+j);for(i=0;iM;i

29、+)for(j=0;jN;j+) s+=*(*(a+i)+j); aij*(ai+j)*(*(a+i)+j)例:求数组a的所有元素之和。aij*(ai+j指向二维数组的指针变量 同样可使一个指针变量p指向二维数组a,再通过p访问数组元素。例T10-10.cmain() int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i,k,*p; p=a; k=*p;? k=*(p+2);? for(p=a;pa+2;p+)printf(“%3d,”,*p); ?N列:aij*(p+i*N+j)pi*N+j123456789101112k=p12; 不合法k=*(*(p+1)+

30、2);k=p1*4+2; 合法k=*(p+1*4+2);指向二维数组的指针变量123456789101112k=p例:求矩阵的上三角元素之和。例T10-11.cmain() int a34,*p,i,j,s=0; 输入a p=a; for(i=0;i3;i+) for(j=i;j4;j+) s+=pi*4+j; 或 s+=*(p+4*i+j) printf(“n %d”,s); /s=54N列:aij*(p+i*N+j)pi*N+j123456789101112例:求矩阵的上三角元素之和。例T10-11.c1234567 多维数组的指针作函数参数 用于接受实参数组地址的形参可用两种:行指针和列

31、指针。 以方阵转置为例:例T10-13-1.c void at(int (*p)3) 用行指针 int i,j,t; 缺点:不通用(必须制定列数) for(i=0;i3;i+) for(j=i+1;j3;j+) t=pij; pij=pji; pji=t; p指向一个包含3个整形元素的一维数组(行指针),p相当于一个二维数组! 多维数组的指针作函数参数用列指针:例T10-13-2.c void at(int *p,int n) /n为列数 int i,j,t; for(i=0;in;i+) for(j=i+1;jn;j+) t=pi*n+j; pi*n+j=pj*n+i; pj*n+i=t;

32、优点:通用 在编通用函数时,一般使用列指针。用列指针:例T10-13-2.c 用列指针:例T10-13-3.c int sum(int *p,int m,int n) /m行n列 int i,j,s=0; for(i=0;im;i+) for(j=i;jn;j+) s+=pi*n+j; 或 s+=*(p+n*i+j) return(s); 优点:通用 在编通用函数时,一般使用列指针。用列指针:例T10-13-3.c 104 字符串的指针和指向字符串的指针变量 字符串的表示形式 可用两种方法访问字符串: 用字符数组存放字符串 用字符指针指向一个字符串104 字符串的指针和指向字符串的指针变量例T

33、10-14.cmain() char str5=”abc”; 定义字符数组,并将字符串存入 char *p=str; 定义指针变量,指向字符串 printf(“%s”,str); 通过数组名访问字符串 printf(“%s”,p); 通过指针变量访问字符串 printf(“%c”,*(p+2); 通过指针变量访问字符 strabc0abc010001000p例T10-14.cstrabc0abc010001000 与其它一维数组的指针相比,字符串的指针有其独特之处: 可以通过指针对字符串进行整体访问。 对字符串的操作依赖于结束符。 可以整体赋初值。 有各种字符串处理函数。 与其它一维数组的指针

34、相比,字符串的指针有其独特之处: 本节重点掌握: 通过数组和通过指针操作字符串的基本方法。 常用的字符串处理方法。 本节重点掌握:例:字符串拷贝操作。例T10-15-1.c,例T10-15-2.cmain() char a=”abcdef”,b20; int i; for(i=0; *(a+i)!=0; i+) *(b+i)=*(a+i); *(b+i)=0; printf(“%s”,b);main() char a=”abcdef”,b20,*p1, *p2; p1=a; p2=b; for( ; *p1!=0;p1+,p2+) *p2=*p1; *p2=0; printf(“%s”,b);

35、用指针变量处理例:字符串拷贝操作。例T10-15-1.c,例T10-15-将拷贝操作编成一函数:例T10-15-3.c,例T10-15-4.cvoid copy_string(char *from,char *to) for(; *from; from+,to+) *to=*from; *to=0;还可以改成:void copy_string(char *from,char *to) for(; *from;) *to+=*from+; *to=0;将拷贝操作编成一函数:例T10-15-3.c,例T10-15字符串合并函数:例T10-16.c,void append_string(char *

36、from,char *to) for(;*to; to+); for(; *from;) *to+=*from+; *to=0; 字符串合并函数:例T10-16.c,阅读程序:例T10-17.cvoid f (char *c) main() c+=2; char c20=”abcdef”; (*c)+; f(c+1); c+; *c=0; printf(“%s”,c); 阅读程序:例T10-17.c内存空间的动态分配 在程序设计中,对于要处理的批量数据,我们往往是选用数组作为存放这些数据的数据结构,然而,数组有一个明显的缺点,就是在定义数组时,其长度必须是常值,无法根据需要动态地定义。这样,在

37、很多情况下,不是定义的数组长度不够,就是定义太长以至于浪费。 采用动态分配可以克服这一缺点,并且可以随时释放。 内存空间的动态分配 动态分配内存空间步骤: 定义一指针变量。 申请一片内存空间,并将其首地址赋给指针变量。此时便可通过指针变量访问这片内存;不成功则返回地址为0 用完后释放这片内存空间。 int *p; p=malloc(字节数); free(p);sizeof(类型):返回该类型数据在当前编译系统中所占的字节数。以上函数的原形在stdio.h中。p 动态分配内存空间步骤:p例:对n个学生的分数排序后输出。例T10-18.c #include “stdio.h”void sort(i

38、nt *a, int n) main() int *a,j,n; scanf(“%d”,&n); a=malloc(n*sizeof(int); if(!a) exit(0); for(j=0;jn;j+) scanf(“%d”,a+j); sort(a,n); for(j=0;jy) z=x; else z=y; return(z);main() int (*p)(); 定义指向函数的指针变量p int a,b,c; p=max; 将p指向函数max scanf(“%d%d”,&a,&b); c=(*p)(a,b); 通过p调用函数max 等效于c=max(a,b); printf(“n %

39、d”,c);例T10-19.cint max(int x, int y)把指向函数的指针变量作为函数参数 指向函数的指针变量最常见的用途是把它作为函数的参数,用于接受主调函数传来的某一函数的入口地址,从而在被调函数中可以通过该指针变量调用它所指向的函数,这样,被调函数中就可实现非固定函数的调用,以达到编写通用函数的目的。 例:用矩形法编写一个通用的求定积分的函数。关键问题:如何处理被积函数是未知的。把指向函数的指针变量作为函数参数double intgral (double a,double b,int n, double (*f)() ) int i; double h,x,y,s=0; h=(b-a)/n; for(i=1;i=n;i+) x=a+(i-1)*h; y=(*f)(x); s+=h*y; return(s);例T10-20.cdouble f1(double x) return(3*x*x+2*x-1);main() double s; s=intgral(1.0,2.0,100

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论