有必要购买重疾险吗.doc_第1页
有必要购买重疾险吗.doc_第2页
有必要购买重疾险吗.doc_第3页
有必要购买重疾险吗.doc_第4页
有必要购买重疾险吗.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

第六章 指针6.1指针与指针变量一、指针与指针变量例6.1 变量、单元、地址与指针。27 x0 ch15.6 y-50 z1000 px1003 pyint x = 27; 1000char ch = 0;float y = 15.6; 1002int z = -50; 1003int *px = &x;float *py = &y; 1007 1009 1011 二、指针变量定义例6-2 定义指向int,float,char,型的指针变量。int *p1,*p2;float *p3;char *p6,*p7;例6-3 标识符p1p4的含义是什么?规定 说明函数的标志()、说明数组的标志优先于说明指针的标志*进行结合,若想改变结合性,可以引入括弧( )。int *p1 ; p1是一个指针变量。 p1指向整型单元。 图示: p1 某个 int型单元char (*p2)5 ; p2是一个指针变量。 p2 指向一个含有5个元素的数组。(即p2是数组指针) 该数组是字符数组 图示: p2 5个元素的字符数组 char * p3 5 ; p3是数组,含有5个元素。 p3数组是指针型数组,即p3数组每一元素均是指针。 p3数组中的每一指针都是指向字符单元的指针。 图示: char char charchar char int *p4 ; p4是指针变量。 p4指向一个指针变量。 p4所指向的指针变量指向字符单元。 图示: 指向字符的某个指针变量 p4 char变量要点 记住上述指针定义形式,它们是固定形式。 必须理解指针对象,它贯穿于所有指针操作中。 学会画指针示意图,如能正确画出指针图示,将对指针的所有问题及概念理解有所帮助。三、 指针运算1 取地址运算符 &基本形式 &变量名含义 取得变量的内存单元地址。2取内容运算符 *基本形式 *指针变量含义 取得指针变量所指向单元的内容。例 int x ,*px,y; px = &x ; x=15;y=*px ;3指针加减运算指针加减的含义可以理解为“指向下一单元”。例6-4 指针+/-概念。#include stdio.h main() /* */ int x5 = 1, 3, 5, 7, 9 , *px; /* */ float y3 = 2.0, 4.0, 8.0 , *py; /* */ px=&x0; py=&y0; /* */ printf(A: px=%u py=%u *px=%d *py=%fn, px,py,*px,*py); /* */ px=px+1; py=py+1; /* */ printf(B: px=%u py=%u *px=%d *py=%fn, px,py,*px,*py); /* */ printf(C: px+3=%u py+2=%un, px+3,py+2);4指针比较6.2 用指针处理变量例6-5 将a,b变量中的值按从小到大的顺序排序输出。程序1 用传统的“按名存取”去实现。设输入19 15。main() int a,b,t; scanf(%d %d, &a, &b); if ( ab ) t=a; a=b; b=t; printf(%d %dn,a,b); 程序2 用指针实现对变量的交换。假设输入19,15。main() int a,b,t,*pa,*pb; pa=&a; pb=&b; scanf(%d %d, pa, pb); if ( *pa *pb ) t=*pa; *pa=*pb; *pb=t; printf(%d %dn,*pa,*pb);程序3 采用交换指针方法而不交换a , b变量的值。main() int a,b,*pa=&a,*pb=&b,*p; scanf(%d %d, pa, pb); if ( *pa *pb ) p=pa; pa=pb; pb=p; printf(%d %dn,*pa,*pb);例6-26 如下程序执行后的输出结果是什么?#include stdio.h main() int a, b, k=2, m=4, n=6; int *p1=&k, *p2=&m, *p3; a = p1!=p2; b = 4*(-*p1)/(*p2)+5; *(p3=&n) = *p1*(*p2); printf(a=%d b=%d n=%dn, a,b,n); 6.3 用指针处理一维数组一、数组的指针表示1数组名是数组的起始地址。2数组(基)指针3数组基指针与数组名的差别二、 通过指针存取数组元素1下标法设int a10,*p=a;/* p是a数组的基指针 */ai 含义:a数组第i个元素。 &ai 含义:a数组第i个元素的地址。pi 含义:以p为基地址的数组第i个元素。&pi 含义:以p为基地址的数组第i个元素的地址。例6-6a 在数组中查找元素。具体要求是输入10个整数存入一维数组a,再输入一个待查的整数存入x,程序在数组a中查找x的首次出现位置c(即下标值)并打印出来,如查不到打印Not found!。main() int a10,*p,f,i,x; for (i=0; i10; i+) scanf(%d, &ai); scanf(%d, &x); for (f=0, p=a,i=0; i10; i+) if (pi=x) f=1; break; if (f) printf(Found: %dn, i+1); else printf(Not found!n); 2“(数组基)指针偏移”方式设int a10, *p=a; a+i 这种形式的含义是:a数组第i个元素的地址。*(a+i) 这种形式的含义是:地址为a+i的单元内容。即ai。 p+i 这种形式的含义是:以p为基地址的数组第i个元素地址。*(p+i) 这种形式的含义是:以p为基地址的数组第i个元素内容。a+i &ai *(a+i) aip+i &pi *(p+i) pi例6-6b 问题同例6-6a,在数组中查找元素。main() int a10,*p,f,i,x; for (i=0; i10; i+) scanf(%d, a+i); scanf(%d, &x); for (f=0, p=a,i=0; i10; i+) if ( *(p+i)=x ) f=1; break; if (f) printf(Found: %dn, i+1); else printf(Not found!n); 3元素指针法例6-6c 问题同例6-6a,在数组中查找元素。main() int a10,*p,f,n,i,x; for (i=0; i10; i+) scanf(%d, a+i); scanf(%d, &x); for (n=0,f=0, p=a; p a+10; p+ ) n+; if ( *p = x ) f=1; break; if (f) printf(Found: %dn, n); else printf(Not found!n); p只起元素指针作用,循环控制仍由循环次数计时器i来控制。main() int a10,*p,f,n,i,x; for (i=0; i10; i+) scanf(%d, a+i); scanf(%d, &x); for (n=0, f=0, p=a, i=0; i10; p+,i+ ) n+; if ( *p = x ) f=1; break; if (f) printf(Found: %dn, n); else printf(Not found!n); 4.三种表示数组元素方式的差别例6-7 对于整型数组a10和b10做如下处理:将偶位置的对应元素相加送入整型数组c5;将奇位置对应元素相加送入整型数组d5。请填空。a0+b0 c0 a1+b1 d0a2+b2 c1 a3+b3 d1 a8+b8 c4 a9+b9 d4main() int a10, b10, c5, d5; int *pa, *pb, *pc, *pd, i; for ( i=0; i10; i+ ) scanf(%d, ); for ( i=0; i10; i+ ) scanf(%d, ); for ( pa=a,pc=c,i=0; i10; i+=2, ) *pc = *( ) + *( ); for ( pa=a+1,pb=b+1,pd=d; pd ; , , pd+) *pd = (*pa) + (*pb); for ( i=0; i5; i+ ) printf(%d , ci ); printf(n); for ( i=0; i=a & *s=A&si=A & *p=a& *q1 =a& *q2 *q2 ) cmp = 1;else if ( *q1 %sn”,p1 , p2 );else printf(“%s %sn”, p1 , p2 );例6-16 字符串的复制。 程序-1main() char a=I am a teacher., b20; int i; for ( i=0; ai != 0; i+ ) bi = ai; bi = 0; puts( b ); 程序片段-2 for ( i=0; *(a+i) != 0; i+ ) *(b+i) = *(a+i); *(b+i) = 0;程序片段-3 char *p1, *p2; for ( p1=a, p2=b; *p1 != 0; p1+, p2+ ) *p2 = *p1; *p2 = 0;程序片段-4 char *p1, *p2; p1=a; p2=b; while( (*p2=*p1) != 0 ) p1+; p2+;程序片段-5 char *p1, *p2; p1=a; p2=b; while( ( *p2+ = *p1+ ) != 0 ) ;例6-17 字符串的合并。将串常量b连接到用字符数组存储的字符串a后面。main() char a40, *b, *pa, *pb; b = stop; scanf( %s, a ); pa = a; while ( *pa != 0 ) pa+; pb = b; while ( ( *pa+ = *pb+ ) != 0 ) ; puts(a); 例6-33 下列判断正确的是 。A. char *a=“china”; 等价于 char *a;*a=“china”;B. char str10=“china”; 等价于 char str10;str=“china”;C. char *s=“china”; 等价于 char *s;s=“china”;D. char c10=“abc”; 等价于 char c=“abc”;6.5 用指针处理二维数组一、关于二维数组的地址问题1二维数组的理解2二维数组的地址问题结合int a34= 1,2,3,4,5,6,7,8,9,10,11,12 ;和图6-5来说明二维数组的地址问题,并假设a数组内存首地址为2000。a0+0 (q+0)a0+1(q+1)a0+2(q+2)a0+3(q+3)a1+0a1+1a1+2a1+3a2+0a2+1a2+2a2+3 1 2 3 4 5 6 7 8 9 10 11 12a+0 a0 a+0 a0 a1a2p 数组a0 a+1 a1 a+1p+1 数组a1a+2 a2 a+2p+2 数组a2 (a) (b) 图6-5 二维数组的地址问题int (*p)4; p是“老师级别的指针”,它说的“下一个”是“下一小组”。int *q; q是“小组长级别的指针”,它说的“下一个”是“下一个人”。例6-18 下列程序的输出是什么?设a的起始地址为404。#include stdio.h int a34=0,1,2,3,4,5,6,7,8,9,10,11; int (*p)4=a, *q=a0; main() printf(A: %d %d %dn, a, a+1, a+2 ); printf(B: %d %d %dn, a0, a0+1, a0+2 ); printf(C: %d %d %dn, *a, *(a+1), *(a+2) ); printf(D: %d %d %dn, *(a0+1), *(a1+2), *(a2+3) ); printf(E: %d %d %dn, p, p+1, p+2 ); printf(F: %d %d %dn, q, q+1, q+2 ); printf(G: %d %d %dn, *(p+0), *(p+1), *(p+2) ); printf(H: %d %d %dn, *(q+0), *(q+1), *(q+2) ); printf(I: %d %d %dn, *(*(p+0)+1), *(*(p+1)+1), *(*(p+2)+1) );运行结果 A:404 412 420B:404 406 408C:404 412 420D:404 406 408E:404 412 420F:0 1 2G:1 5 9H:404 412 420I:1 6 113记住几种等效形式转换设int aMN; 则:*(a+i) aia+i &ai*(*(a+i)+j) *(ai+j) aij*(a+i)+j ai+j &aij 二、用指向元素的指针处理二维数组例6-19a 3名学生4门课程的成绩存于一个二维数组score34中,统计每名学生平均成绩和各门课程平均成绩,用元素指针法实现。main() int score34 = 61,62,63,64,71,72,73,74,81,82,83,84; int *q, sum, i, j;/* A:统计每名学生平均成绩 */ for (q=score0, i=0; i3; i+ ) sum=0; for ( j=0; j4; j+ ) sum += *q+; qrintf(%f , sum/4.0); /* B:统计各门课程平均成绩 */ for ( i=0; i4; i+ ) sum=0; q=score0+i; for ( j=0; j3; j+ ) sum += *q; q = q + 4; qrintf(%f , sum/3.0); 61 62 63 64 71 72 73 74 81 82 83 84 i=0时q的游动过程,统计第0名学生总成绩。 i=1时q的游动过程,统计第1名学生总成绩。 i=2时q的游动过程,统计第2名学生总成绩。 图6-6(a) 统计每名学生的平均成绩q(i=0时) q(i=1时) q(i=2时) q(i=3时)q(i=0时) q(i=1时)q(i=2时)q(i=3时)q(i=0时) q(i=1时)q(i=2时)q(i=3时) 61 62 63 64 71 72 73 74 81 82 83 84 图6-6(b) 统计每门课的成绩例6-19b 题目同例6-19a,用”指针+偏移法”实现。main() int score34 = 61,62,63,64,71,72,73,74,81,82,83,84; int *q, sum, i, j;/* A:统计每名学生平均成绩 */ for ( i=0; i3; i+ ) sum=0; q=scorei; for ( j=0; j4; j+ ) sum += *(q+j); qrintf(%f , sum/4.0); /* B:统计各门课程平均成绩 */ for (q=score0,i=0; i4; i+ ) sum=0; for ( j=0; j3; j+ ) sum += *(q+j*4+i); qrintf(%f , sum/3.0); 三、用指向一维数组的指针处理二维数组例6-20 题目同例6-19a,用指向一维数组的指针变量实现对二维数组的处理。main() int score34 = 61,62,63,64,71,72,73,74,81,82,83,84; int (*p)4, sum, i, j;/* A:统计每名学生平均成绩 */ for ( p=score, i=0; i3; i+,p+ ) sum=0; for ( j=0; j4; j+ ) sum += *(*p+j); printf(%f , sum/4.0); /* B:统计各门课程平均成绩 */ for ( p=score, j=0; j4; j+ ) sum=0; for ( i=0; i*lang3 实现了 的比较。A、字符F与字符P B、字符串“Basic”与字符串“Java”C、字符B与字符J D、字符串“Fortran”与字符串“Pascal”6.6 指针数组和多级指针一、指针数组例6-21 指针数组的定义与含义。一组课程名:“Basic”、“Fortran”、“Data Structure”、“English”、“Computer Programming Design for Pascal”的三种存储方案。 设二维字符数组。char class540 = “Basic”, “Fortran”, “Data Structure”, “English”, “Computer Programming Design for Pascal” ; 串常量形式存储,并用5个字符指针变量表示。char *s1 =“Basic”;char *s2 =“Fortran”;char *s3 =“Data Structure”;char *s4 =“English”;char *s5 =“Computer Programming Design for Pascal”; 指针数组char *str5=s1,s2,s3,s4,s5; 或者直接地 char *str5=“Basic”, “Fortrom”, ;字符串的排序问题。“Basic”“Fortran”“English”“Data Structure”“Computer ” s1 s2 s3s4s5例6-22 字符串的排序。#include stdio.h #include string.h main() char *s5= Fortran,Data Structure,Basic, Computer Programming Design for Pascal,English ; int min, i, j; char *t; for ( i=0; i4; i+ ) for (min=i,j=i+1; j5; j+ ) if ( strcmp(sj,smin) 0 ) min=j; if ( min != i ) t=smin; smin=si; si=t; /* 为理解而增加的测试程序片段 */ printf(= Test : i=%d =n, i);for ( k=0; k5; k+ ) puts( sk );(void)getch(); for ( i=0; i5; i+ ) puts( si ); 二、多级指针例6-23 利用多级指针处理变量。 #include stdio.h main() int a=17, *p1,*p2, k; p1=&a; p2=&p1; k=(*p1)*(*p2); printf ( %d*%d=%dn, *p1, *p2, k ); 6.7 指针与动态存储分配一、 程序静态存储空间与静态存储空间1. 程序内存空间逻辑图2. 栈管理与堆管理3. 动态堆管理函数3.1 申请、释放;分配、回收u 从程序员的角度:申请与释放空间u 从操作系统的角度:分配与回收空间3.2 申请、释放的系统函数u 存储器申请与释放的函数均在stdlib.h文件中定义。u malloc函数用于申请存储空间。对函数malloc的调用方式是:(指针所指对象的数据类型 *) malloc(sizeof(指针所指对象的数据类型)*个数) 功能:从内存中申请一块指定字节大小的连续空间,返回该存储块的首地址作为函数的结果。如果申请空间失败,说明没有足够的空间可供分配,返回空指针NULL。 例:int *pi,*pj;pi=(int *)malloc(sizeof(int);pj=(int *)malloc(sizeof(int)*10); 内存图示。u free函数用于释放经malloc函数申请的内存空间free的调用方式是: free(指针变量名) 功能:释放以指针变量名所指的位置开始的存储块,以分配时的存储块为基准。 注意点:(1) free与malloc必须配对使用,使用malloc申请的空间必须用free释放。(2) 语句“free(p);”不改变p的内容。该语句执行以后,就不能用任何的指针再访问这个存储区。例如,p和q指向同一地址,语句“free(p);”执行以后,q所指的空间也将不能再使用,因为这部分空间已经被系统回收了。32 动态数组【问题】定义数组时,程序员必须对数组的长度有一个正确的估计,否则就可能造成大量空间的的浪费。 C语言提供的动态分配空间,很好地解决了这个问题。 【例】编写程序首先询问用户学生的人数,然后读入这些学生的成绩到一组动态分配的空间中,最后输出这组成绩。 #include stdio.h #include stdlib.h #define ERROR printf(out of memoryn);return; void main() int size; int *p,*aux; printf(输入班级参考的实际人数:); scanf(%d,&size); p=(int *)malloc(sizeof(int)*size); if (p=NULL) printf(“系统空间不足!n”);return; printf(输入 %d 个学生成绩:,size); for (aux=p;auxp+size;aux+) scanf(%d,aux); for (aux=p;auxp+size;aux+) printf( %d,*aux); free(p); u NULL表示空指针。 空指针是一个特殊的值,C语言为指针类型的变量专门定义一个空值,将空值赋值给一个指针变量以后,说明该指针变量的值不再是不定值,是一个有效的值,但是并不指向任何变量。 空指针写作NULL,数值为0。 二、 内存动态管理应用-动态数组【例】两个通过“(系数、指数)对”形式及动态存储方式表示的一元n次多项式的求和。三、 内存动态管理应用-动态链表技术作业一、 指导书:6.2二、 教材:P278/10.1;10.2;10.16;10.18三、 补充:1.(验证题)如下程序可将a数组中的正数移入b数组,负数移入c数组,零元素不处理;之后将b数组中的正数和c数组中的负数分别输出,请填空。#include stdio.h main() int a10, b20, c20, *p, *q, *r, i; for ( i=0; i10; i+ ) scanf( %d, a+i ); for ( i=0; i ; i+ ) ci = bi = 0; ; q = b; r = c; while ( p ) if ( ) = *p; else if ( ) *r+ = *p; p+; q =

温馨提示

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

评论

0/150

提交评论