C语言课件第10章指针.ppt_第1页
C语言课件第10章指针.ppt_第2页
C语言课件第10章指针.ppt_第3页
C语言课件第10章指针.ppt_第4页
C语言课件第10章指针.ppt_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

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

文档简介

第十章,指针,表示复杂的数据结构 动态分配内存 有效地使用字符串、数组 在调用函数时能得到多个返回值 能直接处理内存地址,对设计系统软 件是很必要的,为什么引入指针的概念,10.1地址和指针的概念,如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。 内存区的每一个字节有一个编号,这就是“地址” 。,、按变量地址存取变量值的方式称为“直接访问”方式,2、另一种存取变量值的方式称为“间接访问”的方式。即,将变量的地址存放在另一个变量中。,假设变量i_pointer用来存放整型变量的地址, 可以通过语句:i_pointer ; 将的地址(2000)存放到i_pointer中。 要存取变量的值,可以采用间接方式: 先根据变量名i_pointer ,得到的地址(2000),然后从2000 、 200字节取出的值()。,3010,我们把这种专门用来存放变量地址的变量称作是指针变量。,一个变量的地址称为该变量的“指针”。 如,地址2000就是变量i的指针。 用来存放另一个变量的地址(指针)的变量,称为“指针变量”。如 i_pointer 变量。,下面给出指针和指针变量的定义,10.2 变量的指针和指向变量的指针变量,上图中箭头表示“指向” 关系, 在程序中用“*”符号表示“指向” 。 *i_pointer 代表 i_pointer 所指向的变量i,10.1 定义一个指针变量,定义指针变量的一般形式为 基类型 * 指针变量名;,下面都是合法的定义: float *pointer_; / pointer_是指向float型变量的指针变量 char *pointer_; /pointer_是指向字符型变量的指针变量,通常可用赋值语句使一个 指针变量得到另一个变 量的地址,从而使它指 向该变量。如: pointer_; pointer_;,定义指针变量时要注意两点:,在定义指针变量时,指针变量名前面的“*”,用来标示该变量的类型为指针类型。 (2) 在定义指针变量时必须指定基类型。,10. 指针变量的引用,指针变量中只能存放指针,不能将一个整数(或任 何其他非地址类型的数据)赋给一个指针变量。,两个相关运算符:(优先级相同,结合性为自右而左) & : 取地址运算符。 * : 指针运算符(或称“间接访问”运算符)。取指针变量所指向的变量的值。,1. &*pointer_1 等价于 &a 即先进行*pointer_1运算,得到变量a,再执行&运算。 2. *&a 等价于 *pointer_1 等价于 a 即先进行&a 运算,得到a的地址,再执行*运算 3. (*pointer_1) + 等价于 a+ *pointer_1 + 等价于 *pointer_1 pointer_1+,若已执行 pointer_1= 则,请思考: int i =5, j=6 ,m,n; 执行下面的语句后,i,j,m,n的值分别是多少? m= (i+) + (i+) + (i+); n= (+j) + (+j) + (+j) ; 答案: i,j,m,n的值分别是 8,9,15,27,#include void main ( ) int ,; int*pointer_, *pointer_; ; pointer_; pointer_; printf(%,%,); printf(%,%,*pointer_, *pointer_); ,例10. 通过指针变量访问整型变量,程序运行结果为: 100,10 100,10,例10 . 2 输入和两个整数,按先大后小的顺序输出 和。,#include void main() int *1,*2,*,; scanf(,); 1; if() ; printf(=,=,); printf(max=,min=,*1,*2);,运行情况如下: , , , 当输入,时,由于,将和交换。交换之前的情况见图(),交换后见图()。,和交换之前,和交换之后,10.3 指针变量作为函数参数,例10 . 3 对输入的两个整数按大小顺序输出,#include void main() void swap(int *,int *); int ,; int *pointer_,*pointer_; scanf(,); pointer_ ; pointer_2 ; if() swap( pointer_ , pointer_2 ); printf(,b); ,void swap(int *,int *) int temp; temp*1; *; *temp; ,给实参指针变量赋初值: pointer_ ; pointer_2 ;,函数调用 swap( pointer_ , pointer_2 );开始 将实参 指针变量的值传给形参指针变量。,函数swap( pointer_ , pointer_2 );执行过程中将两形参指针变量所指向的内存单元中的值互换,函数调用swap( pointer_ , pointer_2 );结束 将两形参指针变量所占内存单元回收,P226图10-9,是否可以将函数swap()改写成如下形式?不能。 swap(int *p1,int *p2) int*temp; *temp=*p1; /* temp定义后并未被赋值,直接将p1所指变量赋给它,不妥。 */ p1=*p2; p2=*temp; ,只定义没有赋初值的指针变量的值是不可预见的, 对其进行操作,可能会破坏系统的正常工作状态!,能否通过下面的函数实现a和b互换?不能。 swap(int x,int y) int temp; temp=x; x=y; y=temp; 函数调用时,a的值传送给x,b的值传送给y。函数执行完后,x和y的值是互换了,但a和b并未互换。,值传递方式是单向传递,形参值的改变无法传给实参。,能否通过下面的函数实现a和b互换?不能。 swap(int *p1,int *p2) intp; p=p1; p1=p2; p2=p; ,图10.8,形参指针对实参指针的值(地址)传递仍是单向的。,函数调用时,point_1的值传送给p1, point_2的值 传送给p2。函数执行完后, p1和p2的值是互换了, 但point_1和point_2的值并未互换。,调用swap函数前,实参指针变量pointer_1, pointer_2 的值见上图。,调用swap函数开始,形参指针变量p1, p2的值见上图。,Swap执行完,形参指针变量p1, p2 的值见上图。,swap函数执行完后,实参指针变量pointer_1, pointer_2 的值见上图。,指针变量作函数参数实际上是将实参指 针的值传递给形参指针后,形参指针与 实参指针指向相同的内存单元,改变形 参指针所指向的内存单元里的值实际上 就是改变实参指针所指向的内存单元里 的值。,结 论,例10. 输入3个整数,按大小顺序输出(1/2),#include void main() void exchange(int *1,int *2,int *3); int ,*,*,*; scanf(%,%,%,&, &, &); ; exchange(,); printf(,); ,实 参,void exchange(int *, int *, int *) void swap(int *, int *); if(*) swap(,); if(*) swap(,); if(*) swap(,); void swap(int *, int *) int temp; temp*; *; *temp; ,例10. 输入3个整数,按大小顺序输出(2/2),形 参,形 参,主调函数,被调函数,数组的指针是指数组的起始地址。 数组元素的指针是指数组元素的地址。,10.3.1 指向数组元素的指针 定义一个指向数组元素的指针变量,与定义一个指向变量的指针变量的方法相同。,10.3 数组的指针和指向数组的指针变量,例如: int a10; /* 定义a数组 */ int *p; /* 定义p为指向整型变量的指针变量 */ p= /* 使p指向a数组的第0号元素 */,;就是把元素的地址赋给指针变量。,10.通过指针引用数组元素,引用一个数组元素,可以用: 1. 下标法,如形式 2. 指针法,如*()或*() 其中是数组名,是指向数组元素的指针变量, 其初值。,假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:,(1)下标法,例10.5 输出数组中的全部元素,(2) 通过数组名计算数组元素地址,找出元素的值。,例10.5 输出数组中的全部元素,(3) 用指针变量指向数组元素。,例10.5 输出数组中的全部元素,#include void main() int ; int *,; for(;) scanf(,); printf(); for(;();) printf( ,*); ,对三种方法的比较: 1. 、执行效率相同。C编译系统是将ai转换为*(a+i)来处理,费时较多。 2. 比 、快,不必每次重新计算地址,p+自加操作有规律地改变地址值,是较快的。 3. 较直观,能直接知道是第几个元素。 、不直观。,使用指针变量指向数组元素应注意的问题: 1. 可改变指针变量的值,不可改变指针常量的值: 2. 注意指针变量的当前值,设p为指针变量,a为数组名,则 p+ 正确 a+ 错误 a是数组名,它是数组首地址,它的值在程序运行期间是固定不变的,是常量。,例10. 通过指针变量输出数组的个元素。,#include void main() int*,; ; for(; ) scanf(,); printf(); for(;, ) printf(,*); ,有人编写出以下程序:,运行情况: 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483 显然输出的数值并不是数组中各元素的值。,问题出在哪里? 问题出在在第一个for循环结束后,p已经指向数组最后一个元素的下一个内存单元,这些单元里的值是不确定的。,解决这个问题的办法,只要在第二个循环之前加一个赋值语句:;,#include void main() int*,; ; for(;) scanf(,); printf(); p=a; for(;, ) printf(,*); ,3. p可以指向数组以后的内存单元,如p= 但会得不到预期的结果。应保证指针指向数组中有效的元素。 4. 注意指针变量的运算 设p指向数组a(即p=a),则:,1)p+: 使p指向下一元素a1。 2)*p+: +和*同优先级,结合方向为自右而左。故先得到*p,再使p+1=p。,设指针变量p指向数组a,即 p=a,for(i=0;i10;i+,p+) printf(“%d“,*p);,for(i=0;i10;i+) printf(“%d”,*p+);,3)* (p+):先取*p,即a0,再使 p+1=p 。*(+p): 先使p+1=p ,再取*p,即a1。,4)(*p)+: p所指向的元素值加1,即(a0)+。 5)设p=&ai,则: *(-p) a-i,先使p-1=p,再取*p得到ai-1 。 *(p-) ai-,先取*p得到ai ,再使p-1=p 。 *(+p) a+i,先使p+1=p ,再取*p得到ai+1 。,设指针变量p指向数组a,即 p=a,10.3 数组名作函数参数,void main() void f(int arr ,int ); int array 10 ; f(array,10); void (int arr ,int ) ,实参为数组名=地址常量,形参为数组名=地址变量,void f (int *arr, int n) ,例10 将数组中个整数按相反顺序存放,n=10 的情况 m4,n=11 的情况 m5,例10 将数组中个整数按相反顺序存放,所以: (),#include void main() void inv(int ,int ); int , ,; printf(The original array:); for(;) printf (,); printf(); inv (,); printf(The array has been inverted:); for(;) printf (,); printf ();,例10 将数组中个整数按相反顺序存放,void inv(int ,int ) /*形参x是数组名*/ int temp,(); for(;) ; temp; ; temp; return; ,程序运行结果: The original array: , The array has been inverted: ,,对这个程序可以作一些改动。将函数inv中的形参改成指针变量。,#include void main() void inv(int *,int ); int , ,; printf( The original array: ); for(;) printf (,); printf (); inv(,); printf ( The array has been in verted: ); for(;) printf (,); printf ();,void inv(int *,int ) /*形参x为指针变量*/ int*,temp,*,*; int (); ; for(;,) emp*;*;*temp; return; ,将函数inv中的形参改成指针变量。,各指针变量的值见图,形式参数形式上是数组,实际上是指针变量。,归纳起来,如果有一个实参数组,想在函数中改变此数组中的元素值,实参与形参的对应关系有以下种情况:,(1) 形参和实参都用数组名,如: void main() void (int ,int ) int ; (,); ,(2) 实参用数组名,形参用指针变量。如: void () void (int *,int ) int ; (,); ,(3)实参形参都用指针变量。例如: void main() void (int *,int ) int ; int *p=a; (p,); ,形式参数形式上是数组,实际上是指针变量。,(4) 实参为指针变量,形参为数组名。如: void main() void (int x ,int ) ; int *p=a; (p,); ,#include void main() void inv(int *,int ); int ,*; printf(The original array:n ); for(;,) scanf(,); printf(); ; inv(,); /* 实参为指针变量 */ printf(The array has been inverted :); for(; ) printf(,*); printf(); ,例108用实参指针变量改写例10,void inv(int *,int ) int*,temp,*,*; int (); ; for(;,) temp *;*;*temp; return; ,例如: main() int i,*arr; printf(“The original array:n“); for(i=0;i10;i+) scanf(“%d“,arr+i); printf(“n“); inv(arr,10); /*实参为指针变量,但未被赋值*/ 编译时出错,原因是指针变量arr没有确定值,谈不上指 向哪个变量。,注意,如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的数组。,例109 用选择法对个整数按由大到小顺序排序,#include void main() void sort(int ,int ); int*,10; ; for(;) scanf(,); ; sort(,); for(,;) (,*); ,void sort(int ,int ) int ,; for(;) ; for(;) () ; (!) ; ; ; ,10. 多维数组与指针,1. 多维数组元素的地址,先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例 : int a34=1,3,5,7,; 则二维数组a可看成是由3个一维数组所组成的。设二维数组的首行的首地址为 ,则,2000,2008,2016,a0+1 :对应第0行第1列的地址,为2002 a1+1:对应第1行第1列的地址,为2010 a2+1 :对应第2行第1列的地址,为2018 如图10 . 22所示。,二维数组名 a 代表数组a的首元素的地址,为2000,数组a的每一个元素都是一个长度为4的一维数组,故,a+1 :代表下标为1的元素的地址 2008,对应数组名a1 a+2 :代表下标为2的元素的地址 2016,对应数组名a2,一维数组名a0代表数组a0的首元素的地址 &a00 一维数组名a1代表数组a1的首元素的地址 &a10 一维数组名a2代表数组a2的首元素的地址,&a20故,图10.22, a i *( a + i ) a i + j *( a + i )+j &a i j *(a i + j) *(*( a + i )+j ) a i j 由上可看出: a + 1 : 1代表一行中全部元素所占字节数 8 a i + 1 : 1代表一列元素所占字节数 2,所以,第i行第j列的元素的地址可表示为: a i + j,a与a0的值虽相同,但由于指针类型不同: a: 二维数组名,指向行 a0; a0:一维数组名,指向列元素 a00。 故 a+1 a0+1,若a为一维数组:a i 表示a数组的第i个元素的值 若a为二维数组:a i 是一个一维数组名,是一个地址,在行指针前加一个*,行指针就转换为列指针 *a: 指向第0列的指针 在列指针前面加&,列指针就成为行指针 &a0 :指向第0行的指针,例10.0 输出二维数组有关的值,#include define FORMAT , void main() int 341,3,5,7,9, ,; printf(,*); printf(,0 , *(); printf(,0,00); printf(,1,); printf(,10,*(+)+); printf(,*(); printf(,); printf(,*(*( ); ,某一次运行结果如下: , (0行首地址和0行0列元素地址) , (0行0列元素地址) , (0行0首地址和0行0列元素地址) , (1行0列元素地址和1行首地址) , (1行0列元素地址) , (2行0列元素地址) , (2行首地址) , (1行0列元素的值),2 . 指向多维数组元素的指针变量,(1) 指向数组元素的指针变量,例10.11 用指针变量输出二维数组元素的值,#include void main() int 341,3,5,7,9,11,13,15,17,19,21,23; int*; for(;) () printf(); printf(,*); ,运行结果如下: 1 3 5 7 9 11 13 15 19 21 23,可将程序最后两个语句改为 printf(addr, value2,*); 在TC+环境下某一次运行时输出如下:,aij在数组amn中的相对位置的计算: i* n + j /*之前有i行,每行有n个;之前还有j个 */ 故 aij的值可表示为 *(p+ i*n+j ) 例如,数组a34中的a23的值可表示为: *(p+ 2*4+3) 即*(p+11) 如图,(2) 指向一维数组的指针变量,例10.13 输出二维数组任一行任一列元素的值,#include void main ( ) int 1,3,5,7,9,11, 13,15,; int (*),; ; scanf( ,); printf(, ,*(*() ); ,运行情况如下: ,(本行为键盘输入) ,, int a4 ; / a为数组名,有4个整型元素 int (*p)4; / *p为数组名,有4个整型元素 这4个元素分别为: (*p) 0 , (*p) 1 , (*p) 2 , (*p) 3 图 10.29 对应于a00a03,a是二维数组名,故p是行指针,指向二维数组的每一行。如图10.30。 *(p + i) + j 是a数组第i行第j列元素的地址。 即 *(*(p + i) + j) 是 aij 的值。,对 int (*p)4; 的理解:,图10.29,图10.30,3. 用指向数组的指针作函数参数,例10.13 有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数求总平均成绩,用函数找出并输出第个学生的成绩。,#include void main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60,80, 87,90,81,90,99,100,98; average(*score,12);*求12个分数的平均分* search(score,);*求序号为的学生的成绩* ,void average(float *,int ) float*_; float ,; _; (;_;) (*); ; printf(average,aver); ,void search(float (*)4,int ) / / p是指向具有4个元素的一维数组的指针 int ; printf(the score of No. % are:,); for(;) printf(5.2,*(*(); ,程序运行结果如下: : . . . .,例10.4 在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。,#include void main() void search(float (*p)4,int n);/*函数声明*/ float score34=65,57,70,60,58,87, 90,81,90,99,100,98; search(score,); ,void search(float (*p)4,int ) int ,; for(;) flag; for(;) if(*(*()) flag; if() printf(“No.%d fails,his scores are:n“,j+1); for(;) printf(%.,*(*() ); printf(); ,程序运行结果如下: s, : . . . . s, . . . .,10. 字符串与指针,10字符串的表示形式,例 10.5 定义一个字符数组,对它初始化, 然后输出该字符串,#include void main() char string !; printf(,); ,(1) 用字符数组存放一个字符串,然后输出该字符串。,(2) 用字符指针指向一个字符串,可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。 例106 定义字符指针 #include void main() char* string !; printf(,); ,其中, char*string=“I love China!“; char*string; string=“I love China!“;,是把字符串首地址赋给string。 不是把字符串 “I love China!” 赋给* string。,例10.7 将字符串复制为字符串,#include void () char am a boy,20; int ; for(;*()!;) *()*(); *(); printf(string a is : ,); printf( :); for(;!;) printf(,); printf(); ,对字符串中字符的存取,可以用下标方法,也可以用指针方法,例10.8 用指针变量来处理例107问题。,#include void main() char =I am a boy. ,20,*p1,*p2; int ; ; for(;*!;p1,p2) *; *; printf(string is: ,); printf( :); for(;!;) printf(,); printf(); ,程序必须保证使和同步移动。,10. 字符指针作函数参数,例1019 用函数调用实现字符串的复制,#include void main() void copy_string(char from , char to ); char a = am a teacher; char =you are a student; printf(“string a= string , ,); printf(“copy string a to string b:n “); copy_string (,); printf(“nstring a=%snstring b=%sn“,a,b); ,(1) 用字符数组名作参数,void copy_string(char from , char to ) int ; while(!) ; ; ,程序运行结果如下: copy string a to string b: ,() 用字符指针变量 作参数,#include void main() void copy_string(char *, char *); char * am a teacher .; char *you are a student ; printf(“string a= string ,); printf(“copy string a to string b:n “); copy_string (,); printf(“nstring a=%snstring b=%sn“,a,b); ,void copy_string(char *,char *) for(;*from!;from,to) *; *; ,() 对 copy_string 函数体还可写成如下形式:,while(*)!) ; , while(*to*from)!); , while(*!) *; *; ,while(*); 将*赋给*,如果赋值后的*值等于 ,则循环终止(已赋给*),语句也可以改用语句: for(;(*to*from)! ;); 或 for(;*to*from;);,也可用指针变量,函数copy_string可写为 void copy_string (char from ,char ) *,*; ; while(*p2*p1)!); ,10. 对使用字符指针变量和字符数组的讨论,虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点: (1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量只能存放一个字符的地址(字符串第1个字符的地址)。,(2) 赋值方式。对字符数组除了在定义时,其它时候不能整体赋值。指针可以整体赋值,但所赋的不是字符而是首字符的地址。,char str; str !; 错误 而对字符指针变量,可以采用下面方法赋值: char*; !; 正确,(3) 如果定义了一个字符数组,它有确定的值;定义一个字符指针,若未对其赋值,则其值是个不可预料的值。,如: char str; scanf(,str);是可以的。 而常有人用下面的方法,目的是想输入一个字符串,虽然一般也能运行,但这种方法是危险的 : char*; scanf(,);,应当这样: *,; ; (,);,(5)指针变量的值是可以改变的,数组名除了作形参, 值不能被改变,是个指针常量。如:,例10.0 改变指针变量的值,#include void () char*I love China!; ; printf(,); ,下面是错的: char str=“I loveChina!“; str=str+7; / 错误 printf(“%s“,str);,10. 指向函数的指针,10. 用函数指针变量调用函数,可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的指针。,例10.2 求和中的大者。先列出按一般 方法的程序。,#include void main() int max(int,int); int ,; scanf(,); (,); printf(, ,); int max(int ,int ) int ; if(); else ; return(); ,将 main 函数改写为 #include void main() int (int,int); int (*)(int, int); int ,; ; scanf(,); (*)(,); printf(, ,); ,int (*p)() p是指向的函数的指针变量,函数的返回值为整型。 int *p() p是函数名,函数的返回值是指向整型值的指针。 故*p两侧的括弧不可省略,表示p先与*结合,是指针变量,然后再与后面的()结合,表示此指针变量指向函数,这个函数值(即函数返回的值)是整型的。,#include void main() int max(int,int); /* 函数声明 */ int min(int,int); /* 函数声明 */ int add(int,int); /* 函数声明 */ void process (int,int,int(*fun)(); /* 函数声明 */ int ,; printf(enter a and b:); scanf(,);,10. 用指向函数的指针作函数参数,例10.3 设一个函数process,在调用它的时候,每次实现不同的功能。输入和两个数,第一次调用process时找出和中大者,第二次找出其中小者,第三次求与之和。,printf(); process(,); printf (); process (,); printf(); process (,); ,int max(int ,int ) /* 函数定义 */ int z; if(); else ; return(); int min(int ,int ) /* 函数定义 */ int ; if(); else ; return(); ,int add(int ,int ) /* 函数定义 */ int z; ; return(); void process(int ,int ,int (*fun)(int,int) int result; result (*)(,); printf(,); ,10. 返回指针值的函数,一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。 这种带回指针值的函数,一般定义形式为 类型名 *函数名(参数表列); 例如: *(int ,int );,例104 有若干个学生的成绩(每个学生有门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。,#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*; int ,; printf(enter the number of student:); scanf(,); printf(The scores of No are:,);,search(score,); for(;) printf(,*(); float * search(float (*point)4,int ) float *pt; pt*( point ); return(pt); ,运行情况如下: enter the number of student: The scores of No. are: 56.00 89.00 67.00 88.00,例105 对上例中的学生,找出其中有不及格课程的学生及其学号。,#include void main() float score 4=60,70,80,90,56, 89,67,88,34,78,90,66; float search(float (*pointer)4); float*; i ,; f(;) (); (*() printf( scores:,); for(;) printf(,*(); printf(); ,float *search(float (* pointer)4) int i; float *pt; pt = *(pointer+1); for(i=0;i4;i+) if(*(*pointer+i)60) pt=*pointer; return(pt); ,/10.指针数组和指向指针的指针,10. 指针数组的概念,一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为 类型名数组名数组长度; 例如: *;,

温馨提示

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

评论

0/150

提交评论