当前位置:文档之家› 实验报告2(函数)

实验报告2(函数)


t
内存
Ptr
……
后来被释放
P
4、函数的形参是一个指针变量,但用引用调用的形式,即给 ptr 指针取一个别名,所以 一切对于指针 p 的操作,都可以对 ptr 产生作用,不会产生像第二个函数那样 p 被释放, 所以内存的首地址就不再知道,因为此时的首地址已经返回给 ptr 了,如图所示:
ቤተ መጻሕፍቲ ባይዱ
t
Ptr
&p
过程与方法: 过程与方法:
第一个函数: 第一个函数: 还没编写主函数,其在编译阶段就不通过了,出现了 error C2440: '=' : cannot convert from 'double *' to 'double'的错误。 第二个函数: 第二个函数: 编写程序:
#include<iostream> using namespace std; void create2(unsigned int size, double *p) { p = new double[size]; } void main() { int i,s; double *ptr,t=1.0; ptr=&t; cin>>s; create2(s,ptr); for(i=0;i<s;i++) cin>>*(ptr+i); for(i=0;i<s;i++) cout<<*(ptr+i)<<" "; } 结果只能输入数据,并没有数据的输出,程序截图如下:
后来被释放
t
Ptr
P
内存
…… 3、函数的形参是一个双重指针,在主函数中,我们用引用的方式即 p=&ptr,即 p 也指 向了 t,然后用*p = new double[size],即*p 指向了一个新分配内存的首地址,而*p 的内 容就是 t 的地址,即 t 指向了新分配内存的首地址,当调用函数结束后,虽然 p 被释放 了,但 t 已经成功指向了内存的首地址,如图所示:
实验结论: 1、new 可以自动计算所需要分配内存的大小 new 可以自动返回指针类型,无需强制类 型转换,用 new 动态创建一个类对象时,可以自动调用类的构造函数,对动态创建的对 象初始化,用 new 运算符分配内存时要注意用指针返回所分配内存的首地址,当分配成 功时,一定要让形参里的指针指向主函数里的相对参数,要不然所分配的内存就不能找 到了。 函数的调用方式有三种,分别为传值调用,传址调用,引用调用。三种不同方式,产生 的效果也不同,在调用的时候应加以区别。 2、对于具有不同参数书目或者参数类型不同的函数可以定义为重载函数,使得函数可 以同名,利于开发,大大提高工作效率。
请编写 main 函数,创建一个包含用户在运行时确定的个数的 double 型数据的数组, 测试以上 5 个函数,哪些函数正确的实现了将内存的首地址返回的功能?举例说明如何 调用其中正确完成功能的函数。 2. 编写一个程序,用来求两个整数或 3 个整数中的最大数。如果输入两个整数, 程序就输出这两个整数中的最大数,如果输入 3 个整数,程序就输出这 3 个整 数中的最大数(利用重载函数) 。即编写以下两个函数,并在 main()中调用它们。
void create1(unsigned int size, double p) { p = new double[size]; } void create2(unsigned int size, double *p) { p = new double[size]; } void create3(unsigned int size, double **p) { *p = new double[size]; } void create4(unsigned int size, double * &p) { p = new double[size]; } double *create5(unsigned int size) { return new double[size]; }
实验报告提交时间: 实验报告提交时间: 提交时间
2010-10-24
教务处制
实验目的与要求: 1. 2. 3. 4. 掌握指针变量、引用的概念和使用方法; 掌握函数参数的三种传递方式; 掌握数组的动态创建与撤销; 掌握重载函数的概率和使用方法。
实验内容、方法、过程: 实验内容、方法、过程: 1. 下列 5 个函数的功能都是动态分配形参 size 大小个 double 型数据的内存,并将内 存的首地址返回给函数的调用者。
for(i=0;i<s;i++) cout<<*(ptr+i)<<" "; } 结果能输入数据,并且有数据的输出,程序截图如下:
说明函数正确的实现了将内存的首地址返回的功能。 第四个函数 个函数: 第四个函数: 编写程序: #include<iostream> using namespace std; void create4(unsigned int size, double * &p) { p = new double[size]; } void main() { int i,s; double *ptr,t=1.0; ptr=&t; cin>>s; create4(s,*&ptr); for(i=0;i<s;i++) cin>>*(ptr+i); for(i=0;i<s;i++) cout<<*(ptr+i)<<" "; } 结果能输入数据,并且有数据的输出,程序截图如下:
说明函数正确的实现了将内存的首地址返回的功能。 2.编写一个程序,用来求两个整数或 3 个整数中的最大数。如果输入两个整数,程序 就输出这两个整数中的最大数,如果输入 3 个整数,程序就输出这 3 个整数中的最 大数(利用重载函数) 。 #include <iostream> using namespace std; int main() {int max(int a,int b,int c=0); int a,b,c; cin>>a>>b>>c; cout<<"max(a,b,c)="<<max(a,b,c)<<endl; cout<<"max(a,b)="<<max(a,b)<<endl; return 0; } int max(int a,int b,int c)
内存
…… 5、第五个函数直接返回 new 所分配的内存首地址,首先输入想分配的内存大小 s,用 4 做测试,然后再向所分配内存里输入数据“3.6、5.8、2、1” ,如果能返回所分配内存的 首地址,即能成功向里面输数据,也能成功输出。实验证明第五个函数是能返回所分配 内存的首地址的。 6、第二题中先通过输入数据存放到数组中,再通过选择语句判断输入数字的个数,然 后分别调用函数 max 来输入两个或三个数中的最大值。用“4、20、13”来测试,输出 两个最大值 20。
{ if(b>a) a=b; if(c>a) a=c; return a; }
数据处理分析: 数据处理分析: 1、在第一个函数中,new 运算符返回在堆中分配的内存单元的地址,这个地址要赋给 一个指针变量,而第一个函数中是赋给一个 double 型的变量"p",所以会出现错误。 2、函数形参虽然是一个指针变量,但并没有成功返回分配内存的首地址。因为在主函 数中,ptr 指针指向了 t 变量,然后调用函数令指针 p 指向 ptr,也即是指向了 t 变量,然 后用 new 分配内存,此时 p 指针指向了所分配内存的首地址,然后在函数调用完了之后 p 指针就被释放了, 也就是并有没把首地址传给 ptr 或 t, 所分配的内存可以说就这样 “石 沉大海”了,如图所示:
指导教师批阅意见:
成绩评定:
指导教师签字: 年 月 日 备注:
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后 10 日内。
深 圳 大 学 实 验 报 告
课程名称: 课程名称:
面向对象程序设计
实验项目名称: 实验项目名称:
函数
学院: 学院:
计算机与软件学院
专业: 专业:
软件工程
指导教师: 指导教师:
林少聪
报告人: 报告人: 陈肖山
学号: 学号:
2006151013 班级: 班级:
实验时间: 实验时间: 时间
2011-10-18
说明函数没有正确地实现将内存的首地址返回的功能。 第三个函数: 第三个函数: #include<iostream> using namespace std; void create3(unsigned int size, double **p) { *p = new double[size]; } void main() { int i,s; double *ptr,t=1.0; ptr=&t; cin>>s; create3(s,&ptr); for(i=0;i<s;i++) cin>>*(ptr+i);
说明函数正确的实现了将内存的首地址返回的功能。 第五个函数 个函数: 第五个函数: 编写程序:
#include<iostream> using namespace std; double *create5(unsigned int size) { return new double[size]; } void main() { int i,s; double *ptr,t=1.0; ptr=&t; cin>>s; ptr=create5(s); for(i=0;i<s;i++) cin>>*(ptr+i); for(i=0;i<s;i++) cout<<*(ptr+i)<<" "; cout<<endl; } 结果能输入数据,并且有数据的输出,程序截图如下:
相关主题