1、实验八、指针(二)1教学教学进程: 序号 章节 名称1 9.4 指针与字符串2 9.5 指针与函数3 9.6 指针数组和多级指针2考查知识点:指针与字符串,指针作为函数的参数,函数指针,指针函数,指针数组。3实验目的:(1) 掌握指针与字符串的关系。(2) 能正确使用指向函数的指针变量和返回指针的函数。(3) 了解指向指针的指针的概念及使用方法。4实验内容: 课外实验题目(90 分):如下图所示,本程序由若干个文件组成。其中主函数在文件“main.c”中。其它文件中包含了相应的子程序、变量定义和宏定义。请阅读程序完成题目要求。(1)由于采用了指向函数的指针作为 fenzhi()函数的参数,所以
2、在主函数中每个分支只有一条函数调用语句。请在 fenzhi()函数中填写 case E:段的相对应程序。 (10 分)(2)文件“fun4.c”中由条件编译指令分为两个不同的代码段,请分别填写两段代码中的子程序 copy_string()的内容,使程序分别完成字符串的复制。 (每段 10 分,共 20 分)(3)在文件“fun5.c”中,采用返回指针值的函数返回查询数据的地址。请填写子程序search()的内容。 (10 分)(4)填写程序中的空白,实现内存的管理。具体操作见提示。 (每空 5 分,共 50 分)序号 内容12345678910提示:所谓的自由分配和释放内存,指的是在指定的范围
3、内进行。本题的管理范围是以allocbuf 为起始地址,以 ALLOCSIZE 为长度的空间内进行内存管理。如下图所示,pointers为指针数组,其中每一个元素指向开辟的空间首地址。p_size存放每一个指针对应的空间的长度。指针 allocp 永远指向待分配的空间,初始情况下,allocp 指向整个空间的首址。添加时在 p_size 中按照下标顺序查询值为 0 的元素,说明在 pointers 中对应的元素还没有指向任何空间,就将该指针指向新开辟的空间,对应的空间长度存在 p_size 中。删除空间时,对应指针后面的指针都要向前移动,保证再次开辟空间的连续性。被释放的指针对应的长度也要被清
4、除。 程序代码(题目部分):/*main.c*/#include#include“publicFun.h“#include“globalVaria.h“main() int enter_flag=0;while(1)if(enter_flag=0) enter_flag=display(0,“,title0,mulu,“);else if(enter_flag=2) break;switch(getchar()case D:enter_flag=fenzhi(subject0,title1,mulu,mulu1,fun4);break;case E:enter_flag=fenzhi(subj
5、ect1,title2,mulu,mulu1,fun5);break;case F:enter_flag=fenzhi(subject2,title3,mulu,mulu1,fun6);break;case G:getchar();enter_flag=display(4,“,“,“,“);break;default:break;/*fenzhi()*/int fenzhi(char subject,char title,char mulu,char mulu1,void (*fun)()int enter_flag=0;getchar();while(1)if(enter_flag=0) e
6、nter_flag=display(1,“,title,“,mulu1);switch(getchar()case R:getchar();enter_flag=display(2,subject,title,“,“);break;case E:case C:getchar();return 0;default: break;/*fun4.c*/#include#define SELECTION 1#if(SELECTION)void copy_string(char from,char to) void fun4()char a=“I am a teacher.“;char b=“You a
7、re a student.“;printf(“string_a=%snstring_b=%sn“,a,b);copy_string(a,b);printf(“nstring_a=%snstring_b=%sn“,a,b);#elsevoid copy_string(char *from,char *to) void fun4() char a=“I am a teacher.“;char b=“You are a student.“;printf(“字符串 _a=%sn 字符串_b=%sn“,a,b);copy_string(a,b);printf(“n 字符串_a=%sn 字符串_b=%sn
8、“,a,b);#endif/*fun5.c*/#includevoid fun5() float score4=60,70,80,90,56,89,67,88,34,78,90,66;float *search(float (*pointer)4,int n), *p;int i,m;printf(“Enter the number of student:“);scanf(“%d“,getchar();printf(“The scores of No.%d are:n“,m);p=search(score,m);for(i=0;i#define NULL 0#define ALLOCSIZE
9、1000#define POINTERSIZE 10char allocbufALLOCSIZE;char *allocp=allocbuf;char *pointersPOINTERSIZE=NULL;int p_sizePOINTERSIZE=0;int cp_pointer=0;void fun6() int n,i;char * alloc(int n);void free_oc(char *p);void view();printf(“A:分配内存;nF:释放内存;nV:查看内存;nC:返回n“);while(1)switch(getchar()case A:getchar();pr
10、intf(“请输入分配空间的字节数: “);scanf(“%d“,getchar();for(i=0;i0)allocp+=n;elsereturn(NULL);void free_oc(char *p)int i;i= ;pointersi+1=pointersi;pointersi=NULL;p_sizei=0;for(i+;i#include“publicFun.h“#include“globalVaria.h“main() int enter_flag=0;while(1)if(enter_flag=0) enter_flag=display(0,“,title0,mulu,“);el
11、se if(enter_flag=2) break;switch(getchar()case A:while(enter_flag=fenzhi(subject0,title1,mulu,mulu1)fun1();printf(“n%s“,hint);break;case B:while(enter_flag=fenzhi(subject1,title2,mulu,mulu1)fun2(num);printf(“n%s“,hint);break;case C:while(enter_flag=fenzhi(subject2,title3,mulu,mulu1)fun3();printf(“n%
12、s“,hint);break;case D:while(enter_flag=fenzhi(subject3,title4,mulu,mulu1)fun3();printf(“n%s“,hint);break;case E:while(enter_flag=fenzhi(subject4,title5,mulu,mulu1)fun3();printf(“n%s“,hint);break;case F:while(enter_flag=fenzhi(subject5,title6,mulu,mulu1)fun3();printf(“n%s“,hint);break;case G:getchar(
13、);enter_flag=display(4,“,“,“,“);break;default:break;/*globalVaria.c*/int num50;char title50=“ 欢迎学习指针 “,“ 指针与指针变量 “,“ 指针与一维数组 “,“ 指针与二维数组 “,“ 指针与字符串 “,“ 指针与函数 “,“ 指针数组 “;char subject100=“【题目 1】采用指针变量实现地址传递,从而使用函数将两个整数进行交换。“,“【题目 2】n(n#include#include“globalVaria.h“int display(int type,char subject,ch
14、ar title,char mulu50,char mulu130)int i;char c1;system(“cls“);switch(type)case 0:printf(“%s%s%s%sn“,hint1,hint1,hint1,hint1);printf(“I In“);printf(“I%sIn“,title);printf(“I In“);printf(“%s%s%s%sn“,hint1,hint1,hint1,hint1);for(i=0;i=TITLE_LENGTH;i+)printf(“%s“,mului);return 1;break;case 1:printf(“%s%s
15、%sn“,hint1,hint1,hint1);printf(“20%s21n“,title);printf(“%s%s%sn“,hint1,hint1,hint1);for(i=0;i3;i+)printf(“%s“,mulu1i);return 1;break;case 2:printf(“%s%s%sn“,hint1,hint1,hint1);printf(“20%s21n“,title);printf(“%s%s%sn“,hint1,hint1,hint1);printf(“%sn“,subject);printf(“%s“,hint);getchar();return 0;break
16、;case 3:printf(“%s%s%sn“,hint1,hint1,hint1);printf(“20%s21n“,title);printf(“%s%s%sn“,hint1,hint1,hint1);break;case 4:printf(“点击E 退出程序n 点击C返回程序n“);c1=getchar();if(c1!=n) getchar();while(c1!=E if(c1!=n) getchar();if(c1=E) return 2;else return 0;break;default:break;int fenzhi(char subject,char title,ch
17、ar mulu,char mulu1)int enter_flag=0;getchar();while(1)if(enter_flag=0) enter_flag=display(1,“,title,“,mulu1);switch(getchar()case R:getchar();enter_flag=display(2,subject,title,“,“);break;case E:getchar();display(3,“,title,“,“);return 1;break;case C:getchar();return 0;default: break;/*globalVaria.h*
18、/#define TITLE_LENGTH 6extern int num50;extern char title50,subject100,mulu50,mulu130,hint100,hint111;/*publicFun.h*/#include“globalVaria.h“extern int fenzhi(char subject,char title,char mulu,char mulu1);extern int display(int type,char subject,char title,char mulu50,char mulu130);extern void fun1();extern void fun2();extern void fun3();