您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > c++指针,引用和结构体
实验5实验5:指针、引用和结构体要求:⑴掌握指针、指针变量、指针常量的基本概念;⑵掌握指针与数组、指针与函数的关系及应用。⑶初步掌握引用的概念及简单应用。第一部分教程练习:1.上机实验题一观察程序运行结果,学习指针的基本运算。⑴分析变量和数组元素的地址都可以赋给一个指针,一个指针可以加上或减去一个整数;在两个指针指向同一数组不同元素时,可以进行减运算,结果为其间的数组元素个数。一个完整的参考程序如下:#includeiostream.hvoidmain(){inti,a[10];int*p1,*p2;p1=a;//Ap2=p1+5;for(i=0;i=9;i++){a[i]=i*i;couta[i]=a[i]endl;}couta=aendl;//Bcoutp1=p1,p2=p2endl;coutp2-p1=p2-p1endl;cout*p2-*p1=*p2-*p1endl;//C}实验5⑵上机要求将程序中A行改为“p1=&a[0]”观察程序运行结果。将程序中B行改为“cout*a=*aendl;”观察程序运行结果。面向对象上机将程序中C行改为“couta[5]-a[0]=a[5]-a[0]endl;”观察程序运行结果。(3)对以上结果写出实验分析:将程序中A行改为“p1=&a[0]”,结果不变,因为“a”和“&a[0]”都表示数组的首地址。将程序中B行改为“cout*a=*aendl;”a是a[0]的地址,*a是元素a[0]的值,即为0。将程序中C行改为“couta[5]-a[0]=a[5]-a[0]endl;”因为a[0]和*p1等价,a[5]和*p2等价,故结果不变。⒉上机实验题二指出下列程序的错误。#includeiostream.hvoidexchange(int,int);voidmain()实验5{coutInputtwodatasepratedbyspace:;inta,b;cinab;coutBeforeExchange:a=a,b=bendl;exchange(a,b);coutAfterExchange:a=a,b=bendl;}voidexchange(intx,inty){intt;t=x;x=y;y=t;}⑴分析本例的目的是在子函数中交换的两个变量的值,在主函数中使用。但函数的数据传值调用方式是将实参的数据值传递给形参,实参和形参在内存中占用不同的地址单元,改变形参值不改变实参值。要想通过改变形参的值而改变实参的值,则应使用指针调用或引用调用。而且引用调用大有取代指针调用之势。使用指针调用如下:#includeiostream.hvoidexchange(int*,int*);voidmain(){coutInputtwodatasepratedbyspace:;inta,b,*p1=&a,*p2=&b;cinab;coutBeforeExchange:a=a,b=bendl;exchange(p1,p2);coutAfterExchange:a=a,b=bendl;}voidexchange(int*x,int*y){intt;t=*x;*x=*y;*y=t;}使用引用调用如下(待讲完引用再做):#includeiostream.hvoidexchange(int&,int&);面向对象上机voidmain(){coutInputtwodatasepratedbyspace:;inta,b;cinab;coutBeforeExchange:a=a,b=bendl;exchange(a,b);coutAfterExchange:a=a,b=bendl;}voidexchange(int&x,int&y){intt;t=x;x=y;y=t;}⑵上机要求分别输出三个程序中形参和输出变量的地址。实验5(3)写出实验分析及结果第一种方法的形参,实参的地址不同,交换的只是指针的指向,故不能实现实参的交换。第二种地址相同,交换的是实参的值。第三种是引用调用,交换的也是实参的值。⒊上机实验题三自定义函数实现字符串的拷贝。⑴分析字符串不允许进行赋值运算,只能使用头文件string.h中定义的strcpy()库函数。本例要求自己编制一个自定义函数实现strcpy()库函数的功能。一个完整的参考程序如下:#includeiostream.hchar*mycopy(char*,constchar*);voidmain(){chars1[]=Iamastudent;chars2[20];mycopy(s2,s1);couts1=s1endl;couts2=s2endl;}char*mycopy(char*to,constchar*from){char*temp=to;for(;*to++=*from++;);returntemp;}⑵上机要求将自定义函数改为下列程序段:char*mycopy(char*to,constchar*from)面向对象上机{char*temp=to;for(inti=0;*(from+i)!='\0';i++)*(to+i)=*(from+i);*(to+i)='\0';returntemp;}观察现象。实现了字符串的拷贝。将自定义函数的声明改为:“char*mycopy(constchar*,constchar*);”自定义函数相应改为:char*mycopy(constchar*to,constchar*from){char*temp=to;for(;*to++=*from++;);returntemp;}观察现象。出错D:\课程\lab1_1\lab1_1.cpp(13):errorC2440:'initializing':cannotconvertfrom'constchar*'to'char*'D:\课程\lab1_1\lab1_1.cpp(14):errorC2166:l-valuespecifiesconstobject在自定义函数中能否使用如下的语句“*from='a';”不能。‘a’是字符,*from是指针局部变量,不能把字符常量赋给指针,只能把地址或数组名、指针赋给指针变量。(3)写出实验分析及结果1、形参,实参类型应保持一致。2、常量在自定义函数中最好不变,而是赋给一个新定义变量,再改变变量的值。实验53、自定义函数结束,记得返回变量的值,而不是常量的值。⒋上机实验题四使用函数的指针分别调用两个函数sum1和sum2分别求不大于该数的偶数或奇数之和。⑴分析使用函数的指针,可以通过指针的赋值分别调用不同的函数。#includeiostream.hintsum1(int);intsum2(int);voidmain(){inta;int(*f)(int);//A指针函数coutInputadata:;cina;if(a%2==0){f=sum1;cout(*f)(a)endl;}else{f=sum2;cout(*f)(a)endl;}}intsum1(intm){ints1=0;for(inti=2;i=m;i=i+2)s1=s1+i;returns1;}intsum2(intn){ints2=0;for(inti=1;i=n;i=i+2)s2=s2+i;面向对象上机returns2;}⑵上机要求将A行改为“int(*f)(int);”,观察现象。未变化。分别输出两个函数的函数名,观察其地址值。(3)写出实验分析及结果地址相差5字节。自定义函数的内存空间大致在4~5个字节。实验5⒌上机实验题五编写一个程序判定一个字符在一个字符串中出现的次数,如果该字符不出现则返回0。给出源代码及运行结果。#includeiostream.hintfreq(chars[],charch){char*p=s;intcount=0;while(*p!='\0'){if(*p==ch)count++;p++;}returncount;}voidmain(){chars[100],ch;cout”请输入字符串:”;cins;cout”请输入字符:”;cinch;coutch”出现的次数:”freq(s,ch);面向对象上机printf(%c出现次数:%d\n,ch,freq(s,ch));}第二部分自测练习1.自测练习一使用new和delete创建动态堆栈。⑴分析new和delete运算符可以对数组和结构体进行动态内存分配和释放。一个完整的应用程序如下:#includeiostream.hstructStack{intstacksize;long*buffer;long*sp;}p;voidini(intsize){p.stacksize=size;p.sp=p.buffer=newlong[size];}voiddel(){deletep.buffer;}voidpush(longdata)实验5{if(p.sp=p.buffer+p.stacksize)cerrstackoverflow!\n;else{*p.sp++=data;coutdataispushed.endl;}}longpop(){if(p.sp=p.buffer){cerrstackisempty!\n;return0;}return*--p.sp;}voidmain(){ini(5);//Apush(1234);push(5678);push(1357);push(2468);coutendl;coutpop()ispopedendl;coutpop()ispopedendl;coutpop()ispopedendl;coutpop()ispopedendl;coutpop()ispopedendl;del();}⑵上机要求将程序中A行分别改为“ini(2);”和“ini(8);”观察程序运行结果。面向对象上机(3)写出实验分析及结果2.自测练习二编写程序建立一个学生学习成绩的链表,完成链表的输出、插入、删除操作。⑴分析在程序中,经常用到数量不确定的相同结构类型的数据处理,用数组往往造成存储空间的浪费,链表可以通过数据的动态存储克服这一缺点。一个完整的应用程序如下:#includeiostream.hstructStudent//创建结构{longnumber;floatscore;Student*next;};实验5Student*head;Student*Create()//建立链表{Student*ps;Student*pend;ps=newStudent;head=NULL;pend=ps;coutInputnumberandscore:endl;cinps-numberps-score;while(ps-number!=0){if(head==NULL)head=ps;elsepend-next=ps;pend=ps;ps=newStudent;cinps-numberps-score;pend-next=NULL;}deleteps;return(head);}voidshowlist(Student*head)//输出链表{coutnowtheitemsoflistare\n;while(head){couthead-number,head-scoreendl;head=head-next;}}voidInsert(Student*head,Student*
本文标题:c++指针,引用和结构体
链接地址:https://www.777doc.com/doc-2901680 .html