第8章_指针_第1页
第8章_指针_第2页
第8章_指针_第3页
第8章_指针_第4页
第8章_指针_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

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

文档简介

第八章,指针,表示复杂的数据结构 动态分配内存 有效地使用字符串、数组 在调用函数时能得到多个返回值 能直接处理内存地址,对设计系统软 件是很必要的,使用指针可以:,8.1地址和指针的概念,如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。 内存区的每一个字节有一个编号,这就是“地址“ 。,1、按通过变量名直接找到变量地址,从而存取变量值的方式称为“直接访问“方式,2、变量i的地址存放在另一个变量p中,通过变量p获得变量i的地址,再对变量i进行存取变量值的方式称为“间接访问“。,假设变量i_pointer用来存放整型变量的地址, 可以通过语句:i_pointer = 将i的地址(2000)存放到i_pointer中。 要存取变量i的值,可以采用间接方式: 先根据变量名i_pointer ,得到i的地址(2000),然后从2000 、 2001字节取出i的值(3)。,3010,我们把这种专门用来存放变量地址的变量称作是指针变量。,一个变量的地址称为该变量的“指针“。 如,地址2000就是变量i的指针。 用来存放另一个变量的地址(指针)的变量,称为“指针变量”。 如 i_pointer 变量。,下面给出指针和指针变量的定义,8.2 变量的指针和指向变量的指针变量,上图中箭头表示“指向“ 关系, 在程序中用“*“符号表示“指向“ 。 *i_pointer 代表 i_pointer 所指向的变量i,8.2.1 定义一个指针变量,定义指针变量的一般形式为 基类型 * 指针变量名;,下面都是合法的定义: int *pointer; / pointer是指向int型变量的指针变量 char *p, c; / p是指向字符型变量的指针变量, c是字符变量。 定义时,如果变量前面没有*号,则变量不是指针变量。,int * pointer int * 是类型 pointer是变量名,使用取地址运算符得到一个变量的地址, 将其赋值给指针变量。 pointer_1= 于是: pointer_1 指向 i pointer_2 指向 j,8.2.2 指针变量的初始化,& : 取地址运算符。,定义指针变量时要注意两点:,在定义指针变量时,指针变量名前面的“*“,用来标示该变量的类型为指针类型。 (2) 在定义指针变量时必须指定基类型。,定义指针变量时要注意两点:,在定义指针变量时,指针变量名前面的“*“,用来标示该变量的类型为指针类型。 (2) 在定义指针变量时必须指定基类型。,8.2.2 指针变量的引用,指针变量中只能存放指针,不能将一个整数(或任 何其他非地址类型的数据)赋给一个指针变量。,两个相关运算符:(优先级相同, 结合性为自右而左) & : 取地址运算符。 * : 指针运算符(或称“间接访问”运算符)。取指针变量所指向的变量的值。 可理解为:取内容运算,&和*为一元运算符,优先级很高。运算时“从右向左” 1. &*pointer 等价于pointer 等价于 &a 先进行*pointer运算, 得到变量a, 再执行&运算。 2. *&a 等价于 a 等价于*pointer 即先进行&a 运算, 得到a的地址, 再执行*运算 在一个表达式中,如果*和&紧密相连在一起时,可以理解为: 两个运算相互抵消。,若已执行 pointer= 则,#include “stdio.h“ void main() int a=7; int *aPtr; aPtr= ,例8.1 通过指针变量访问整型变量,& 取地址 * 取内容 %p: 以16进制数整型格式输出一个内存地址,例8 . 2 输入a和b两个整数,按先大后小的顺序输出,#include void main() int a,b, *p1= ,p1和p2交换之前,p1和p2交换之后,指针与函数,指针既然是数据类型,自然可以做函数的参数和返回值的类型,8.2.3 变量的指针作为函数参数,1) 地址做为实参,指针为形参,#include int cube( int *p ) /形参为指针 int cube; cube = *p * *p * *p; return cube; void main() int n=5, cn; cn=cube( ,2)指针做为实参,指针为形参,#include int cube( int *p ) /形参为指针 return *p * *p * *p; void main() int n=5, *p= ,3)子函数直接修改实参指针所指向的对象,#include void cube( int *p1, int *p2 ) /形参为指针 *p2 = *p1 * *p1 * *p1; /* cube函数直接修改 *p2对应的实参指针所指向的对象*/ void main() int n=5, *p= ,void swap(int *x,int *y) int temp; temp = *x; *x = *y; *y = temp; ,main() void swap(int *x,int *y); int a, b; a = 15; b = 8; swap( ,void swap(int x,int y) int temp; temp = x; x = y; y = temp; ,main() void swap(int x,int y); int a, b; a = 15; b = 8; swap(a, b); printf(“a=%d,b=%d“,a,b); ,程序 1,程序 2,例8.4 :编写函数实现两数的互换,实 参,形 参,结果有何不同?,简单变量作函数参数,图7-3 swap函数调用前后参数变化的示意图,主调函数,被调函数,main() int a, b; a = 15; b = 8; swap(a, b); printf(“a=%d,b=%d“,a,b); ,void swap(int x, int y) int temp; temp = x; x = y; y = temp; ,15,15,a,b,实 参,形 参,8,8,程序 1,x,y,x, y是auto型局部变量,只存在于子函数中,主调函数,被调函数,main() int a, b; a = 15; b = 8; swap( ,void swap(int *x, int *y) int temp; temp = *x; *x = *y; *y = temp; ,&a,&a,实 参,形 参,&b,&b,程序 2,x,y,15,a,b,8,指针变量作函数参数,指针做函数参数,#include “stdio.h“ main() void swap(int *x,int *y); int a=15, b=8; printf(“执行函数前: ,指针变量作函数参数实际上是: 将实参指针的值传递给形参指针,形参指针与实参指针指向相同的内存单元; 改变形参指针所指向的内存单元里的值,实际上就是改变实参指针所指向的内存单元里的值。,数组的指针是指数组的起始地址。 数组元素的指针是指数组元素的地址。,8.3.1 指向数组元素的指针 定义一个指向数组元素的指针变量,与定义一个指向变量的指针变量的方法相同。,8.3 数组的指针和指向数组的指针变量,例如: int a10; /* 定义a数组 */ int *p; /* 定义p为指向整型变量的指针变量 */ p= /* 使p指向a数组的第0号元素 */,p=就是把a0元素的地址赋给指针变量p 。,定义数组 int a10, 数组名为数组的首地址,a=&a0 p=a 等价于 p = &a0,8.3.2通过指针引用数组元素,引用一个数组元素,可以用: 1. 下标法,如 ai 形式 2. 指针法,如 *(a+i) 或 *(p+i) 其中a是数组名, p是指向数组元素的指针变量, 其初值 p=a。,假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法:,采用下标法输出数组中的全部元素,(2) 通过数组名计算数组元素地址, 找出元素的值。,(3) 用指针变量指向数组元素,#include #define N 3 void main() int aN,i; int *p=a; puts(“请输入数组:“); for( i=0; iN; i+ ) scanf(“%d“, p+i ); printf(“n“); for( p=a; pa+N; p+ ) printf(“%3d“, *p ); ,使用指针变量指向数组元素应注意的问题: 1. 可改变指针变量的值,不可改变指针常量的值: 2. 注意指针变量的当前值,设p为指针变量, a为数组名,则 p+ 正确 a+ 错误 a是数组名, 它是数组首地址, 它的值在程序运行期间是固定不变的, 是常量。,#include #define N 3 void main() int *p,i,aN; p=a; puts(“请输入数组:“); for(i=0;iN;i+ ) scanf(“%d“, p+ ); printf(“n“); for(i=0; iN; i+, p+ ) printf(“%d“,*p); ,有人编写出以下程序, 是否有错误?,问题出在哪里? 问题出在在第一个for循环结束后, p已经指向数组最后一个元素的下一个内存单元, 这些单元里的值是不确定的。,解决办法, 在第二个for循环之前加一个赋值语句:p=a;,#include #define N 3 void main() int *p,i,aN; p=a; puts(“请输入数组:“); for(i=0; iN; i+ ) scanf(“%d“, p+ ); for(i=0, p=a; iN; i+, p+ ) printf(“%3d“,*p); ,3. p可以指向数组以后的内存单元,如int a10; p= 但不会得到预期的结果。 应保证指针指向数组中有效的元素。,1) p+ : 使p指向下一元素。 2) *p+ : +和*同优先级,自右而左结合。 等价于 *(p+),p+: 先用p,再加1。 即先算 *p, 再使p=p+1。,有 int a10, *p; p=a;,for(i=0;i10;i+,p+) printf(“%d“,*p);,for(i=0;i10;i+) printf(“%d“,*p+);,3) *+p: 先使p=p+1 ,再取*p。,4)(*p)+: p所指向的元素值加1,即(a0)+。 5)设p=&ai,则: *(-p) a-i,先使p=p-1,再取*p得到 ai-1 。 *(p-) ai-,先取*p 得到ai ,再使 p-1=p 。 *(+p) a+i,先使p+1=p ,再取*p得到ai+1 。,设指针变量p指向数组a, 即 p=a,以下程序的执行结果为:,#include #define PR printf(“t“ #define NL “n“) void main() int i,a4=11,22,33,44,*p=a ; for(i=0; i3; i+ ) printf(“ %3d“, *p+ ); PR“*p+“NL; / *(p+) 等价于 *p, p+ for(i=0, p=a; i3; i+ ) printf(“ %3d“, *+p ); PR“*+p“NL; / *(+p)等价于 p+, *p for(i=0, p=a+3; i3; i+ ) printf(“ %3d“, *-p ); PR“*-p“NL; / *(-p)等价于 -p, *p for(i=0, p=a+3; i3; i+ ) printf(“ %3d“, *p- ); PR“*p-“NL; / *(p-)等价于 *p, p- for(i=0; i3; i+ ) printf(“ %3d“, (*p)+ ); PR“(*p)+“NL; / 等价于 *p=*p+1 ,8.3.3 用数组名作函数参数,例如: void main() void func(int arr ,int n); int array 10 ; func( array ,10); void func(int arr ,int n) ,在编译时是将arr按指针变量来处理的,相当于将函数f的首部写成 f (int *arr, int n),当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量。,例8.8 如下图所示,将数组a中n个整数按相反顺序存放 p239,数组长度n=10 时, 正中间的元素下标:m=4, m=(n-1)/2,数组长度n=11 的情况 中间元素下标m=5,例8.8 将数组a中n个整数按相反顺序存放,所以: m=(n-1)/2,将数组a中n个整数按相反顺序存放的算法:,确定数组的中间元素下标 m = (n-1)/2; 循环条件: for(i=0; i=m; i+) 互换规则: ai = an-i-1;,#include void main() void inv( int a,int n); void printArray(int a,int n); int a10=3,7,9,11,0,6,7,5,4,2; printf(“数组初值:n“); printArray(a, 10); inv (a,10); printf(“反序后的数组:n“); printArray(a, 10); ,例8.8 将数组a中n个整数按相反顺序存放,/打印数组函数定义 void printArray ( int a, int n) int i; for(i=0; in; i+) printf(“%4d“,ai); printf(“n“); /反序存放数组函数定义 void inv ( int a, int n ) int i,temp,m; m=(n-1)/2; for(i=0; i=m; i+) temp=ai; ai=an-i-1; an-i-1=temp; ,#include void main() void inv( int *x, int n); void printArray(int a,int n); int a10=3,7,9,11,0,6,7,5,4,2; printf(“数组初值:n“); printArray(a, 10); inv (a,10); printf(“反序后的数组:n“); printArray(a, 10); ,例8.8 修改程序,以指针做为函数形参,/打印数组函数定义 void printArray ( int a, int n) int i; for(i=0; in; i+) printf(“%4d“,ai); printf(“n“); /反序存放数组函数定义 void inv(int *x,int n) int *pi, *pj, temp, m; m=(n-1)/2; for( pi=x, pj=pi+n-1; pi=x+m; pi+, pj-) temp=*pi; *pi=*pj; *pj=temp; ,形式参数形式上是数组,实际上是指针变量。,归纳起来,如果有一个实参数组,想在函数中改变此数组中的元素值,实参与形参的对应关系有以下4种情况:,(1) 形参和实参都用数组名,如: void main() void f(int x ,int n) int a10; f(a,10); ,(2) 实参用数组名,形参用指针变量。如: void main() void f(int *x,int n) int a10; f(a,10); ,(3)实参形参都用指针变量。例如: void main() void f(int *x,int n) int a10; int *p=a; f(p,10); ,形式参数形式上是数组,实际上是指针变量。,(4) 实参为指针变量,形参为数组名。如: void main() void f(int x ,int n) int a10; int *p=a; f(p,10); ,10.4 字符串与指针,10.4.1字符串的表示形式,例 10.15 定义一个字符数组,对它初始化, 然后输出该字符串,#include void main() char string=“i love china!“; printf(“%sn“,string); ,(1) 用字符数组存放一个字符串,然后输出该字符串。,(2) 用字符指针指向一个字符串,可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。 例8.17 定义字符指针 #include void main() char * string=“i love china!“; printf(“%sn“, string ); ,其中, char *string=“i love china!“; char *string; string=“i love china!“;,是把字符串首地址赋给string。 不是把字符串 “i love china!“ 赋给* string。,例8.18 将字符串a复制为字符串b,#include void main() char a=“i am a boy.“, b20; int i; for(i=0; *(b+i)= *(a+i);i+); printf(“string a is :%s n“,a); printf(“string b is: “); for(i=0; bi!=0; i+) printf(“%c“,bi); ,对字符串中字符的存取,可以用下标方法,也可以用指针方法,例8.18 用指针变量来处理例8.17问题。 p258,#include “stdio.h“ #include “string.h“ void main() char a=“GuangZhou HEMC.“,b40; char *p1=a,*p2=b; for(; *p1!=0 ; p1+, p2+) *p2=*p1; *p2=0; printf(“string b is:“); puts(a); printf(“string b is:“); p2=b; puts(p2); ,程序必须保证使p1和p2同步移动。,8.4.2 字符指针作函数参数,#include void main() void copy_string(char from, char to); char a=““; char b=“.“; printf(“字符串 a=%s n字符串 b=%sn“, a,b); printf(“n拷贝字符串a至b:n “); copy_string (a,b); printf(“n字符串 a=%s n字符串 b=%sn“,a,b); void copy_string(char from, char to) int i=0; while(fromi!=0) toi=fromi;i+; toi=0; ,(1) 用字符数组名作参数,(2) 用字符指针变量 作参数,#include void main() void copy_string(char *from, char *to); char a=““; char b=“.“; printf(“字符串 a=%s n字符串 b=%sn“, a,b); printf(“n拷贝字符串a至b:n “); copy_string (a,b); printf(“n字符串 a=%s n字符串 b=%sn“,a,b); void copy_string( char *from, char *to) for( ; *from!=0; from+, to+) *to= *from; *to=0; ,void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to= *from; *to=0; ,(3) copy_string 函数体还可写成如下形式:, while( ( *to=*from)!=0 ) to+; from+; , while(*to+=*from+)!=0); , while( *from!=0 ) *to+ = *from+; *to=0; ,while( *to+ = *from+ ); 将*from赋给*to,如果赋值后的*to值等于 0,则循环终止(0已赋给*to),hile语句也可以改用for语句: for( ; (*to+=*from+)!= 0 ; ); 或 for( ; *to+=*from+; );,也可用指针变量,函数copy_string可写为 void copy_string (char from ,char to ) char *p1,*p2; p1=from;p2=to; while(*p2+=*p1+)!=0 ); ,8.4.3 对使用字符指针变量和字符数组的讨论,虽然用字符数组和字符指针变量都能实现字符串的存储和运算, 但它们二者之间是有区别的, 不应混为一谈, 主要有以下几点: (1) 字符数组由若干个元素组成,每个元素中放一个字符, 而字符指针变量只能存放一个字符的地址(字符串第1个字符的地址)。,(2) 赋值方式。对字符数组除了在定义时,其它时候不能整体赋值。指针可以整体赋值,但所赋的不是字符而是首字符的地址。,char str14; str=“i love china!“; 错误 而对字符指针变量,可以采用下面方法赋值: char *a; a=“i love china!“; 正确,(3) 如果定义了一个字符数组,它有确定的值;定义一个字符指针,若未对其赋值,则其值是个不可预料的值。,如: char str10; scanf(“%s“,str);是可以的。 而常有人用下面的方法,目的是想输入一个字符串,虽然一般也能运行,但这种方法是危险的 : char *a; /定义指针,但并申请合适的内存空间 scanf(“%s“,a);,应当这样: char str10 , *a=str; scanf(“%s“,a);,(5)指针变量的值是可以改变的,数组名除了作形参, 值不能被改变,是个指针常量。如:,例8.20 改变指针变量的值,#include void main() char *a=“i love china!“; a=a+7; printf(“%s“,a); ,下面是错的: char str=“i lovechina!“; str=str+7; / 错误 printf(“%s“,str);,8.5 指向函数的指针,8.5.1 用函数指针变量调用函数,在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。 一个函数在编译时被分配给一个入口地址。 这个函数的入口地址就称为函数的指针。,可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。 通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。 函数指针变量定义的一般形式为: 类型说明符 (*指针变量名) ( )或 (形参表列) ; “类型说明符”表示被指函数的返回值的类型。 “(* 指针变量名)”表示“*”后面的变量是定义的指针变量。 ( )或 (形参表列)表示指针变量所指的是一个函数。,#include void main() int max(int,int); int a,b,c; scanf(“%d,%d“,例: 8.22 求两数中的大数 p267,int (*p)(int, int); p=max;,c=(*p)(a,b);,#include void main() int max(int,int); int a,b,c; int (*p)(int, int); /定义指向函数的指针p p=max; /函数名是一个指针(地址) printf(“输入两个整数a,b: “); scanf(“%d,%d“,返回指针的函数,在语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。 定义指针型函数的一般形式为: 类型说明符 * 函数名(形参表) /*函数体*/ 其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。,/*本程序是通过指针函数,输入一个17之间的整数,输出对应的星期名。*/ #include void main() int i; char *day_name(int n); printf(“input Day No:n“); scanf(“%d“, ,int (*p) () p是指向的函数的指针变量, 函数的返回值为整型。 int * p() p是函数名, 函数的返回值是指向整型值的指针。 故*p两侧的括弧不可省略, 表示p先与*结合, 是指针变量, 然后再与后面的()结合,表示此指针变量指向函数, 这个函数值(即函数返回的值)是整型的。,int max(int x,int y) return xy?x:y; int min(int x,int y) return xy?x:y; int add(int x,int y) return x+y; void process(int x, int y, int (*fun)(int,int) printf(“%dn“,(*fun)(x,y);,8.5.2 用指向函数的指针作函数参数,例8.23 设一个函数process,在调用它的时候,每次实现不同的功能。输入a和b两个数,第一次调用process时找出a和b中大者,第二次找出其中小者,第三次求a与b之和。,void main() int a,b; printf(“enter a,b: “); scanf(“%d,%d“,int max(int x,int y) return xy?x:y; int min(int x,int y) return xy?x:y; int add(int x,int y) return x+y; void process(int x, int y, int (*fun)(int,int) printf(“%dn“, (*fun)(x,y); ,8.6 返回指针值的函数,一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。 这种带回指针值的函数,一般定义形式为 类型名 *函数名(参数表列); 例如: int *a(int x,int y);,例8.24 有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。,#include void main() float score 4=60,70,80,90, 56,89,67,88,34,78,90,66; float *search(float (*pointer)4,int n); float *p; int i, m; printf(“enter the number of student:“); scanf(“%d“, ,float * search(float (*point)4,int n) float *pt; pt=*( point +n); return(pt); ,8.7指针数组和指向指针的指针,8.7.1 指针数组的概念,一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为 类型名 数组名数组长度; 例如: int *p4;,例8.26 将若干字符串按字母顺序(由小到大)输出。,#include #include void main() void sort(char *name ,int n); void printf(char *name ,int n); char *name =“follow me“,“basic“,“great Wall“,“fortran“,“computer design“; int n=5; sort(name,n); print(name,n); ,void sort(char *name ,int n) char *temp; int i,j,k; for(i=0;i0)k=j; if(k!=i) temp=namei; namei=namek; namek=temp; ,void print(char *name ,int n) int i; for(i=0;in;i+) printf(“%sn“,namei); ,运行结果为: basic computer design fortran follo me great all,指向指针的指针,如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。,8.7.2 指向指针的指针,怎样定义一个指向指针数据的指针变量呢?如下: char *p; p的前面有两个*号。 *运算符从右到左结合, *p= *(*p)。 char * p 定义一个指向字符数据的指针变量。 p前面有2个*号, 表示指针变量p指向一个字符指针变量。 *p就是 p 所指向的另一个指针变量。,指针练习,#include “stdio.h“ void main() int *p, *s, k=20; s= *p代表: A、s B) &k C) *p D) k,数据区 int,数据区 指针,k,s,2000,int k=20;,20,int *s;,s=&k,2000,*s,int *p;,数据区 指针,4000,p,p=&s,4000,*p =*(*p) = *(*&s) = *s = *&k = k,1) 设有定义:int n=0, *p= D) i=* *p,例8.27 使用指向指针的指针,#include void main() char *name=“visual basic“,“ture basic“,“c language“, “fortran“,“java program“; int i; for(i=0;i5;i+) printf(“%p: %p: %sn“, name+i,*(name+i), *(name+i);,例8.27 使用指向指针的指针,name是一个指针数组,数组名name代表该指针数组的首地址。 数组元素name i 是一个指针,指向对应的字符串。 name+i是namei的地址。name+i就是指向指针型数据的指针。 可以设置一个指针变量p,使它指向指针数组元素。p就是指向指针型数据的指针变量。,例8.27 使用指向指针的指针,#include void main() char *name=“visual basic“,“ture basic“,“c language“,“fortran“,“java program“; char *p; int i; for(i=0;i5;i+) p= name+i; printf(“%p: %p: %s n“, p,*p, *p );,例8.28 一个指针数组的元素指向整型数据的简单例子,#include void main() int a5=1,3,5,7,9; int *num5=,8.7.3 指针数组作main函数的形参,指针数组的一个重要应用是作为main函数的形参。 main函数可以有参数,例如: void main (argc, argv) argc 和argv 就是main函数的形参。 main函数是由系统调用的。当处于操作命令状态下,输入main所在的文件名(经过编译、连接后得到的可执行文件名), 系统就调用main函数。,语言规定argc(第一个形参)必须是整型变量, argv( 第二个形参)必须是指向字符串的指针数组。 main函数的函数头应写为: main (int argc,char *argv) 由于main函数不能被其它函数调用,因此不可能在程序内部取得实际值。 main函数的参数值是从操作系统命令行上获得的。 运行一个可执行文件时,在DOS提示符下键入文件名+实际参数即可把这些实参传送到main的形参中去。,argument count 变量个数 argc argument values 变量值 *argv argc 表示在命令行下输入命令时,一共有 argc 个参数(文件

温馨提示

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

评论

0/150

提交评论