C++实验函数的应用

桂 林 理 工 大 学
实 验 报 告
实验名称 函数的应用(补充按引用的参数传递) 日期 2018年 04 月05 日
一、实验目的:
对比指针,掌握按引用的参数传递。
二、实验环境:
Visual C++
三、实验内容:
(写出主要的内容)
1. 编写一个函数,用于两个整数的交换,并在主程序中测试之。

#include<iostream.h>
void Swap(int x,int y)
{
	int t;
	t=x;
	x=y;
	y=t;
}
int main()
{
	int x=5,y=6;
	cout<<"交换前:";
	cout<<x<<","<<y<<endl;
	Swap(x,y);
	cout<<"交换后:";
	cout<<x<<","<<y<<endl;
}

输出结果:交换前:5,6
交换后:5,6
(1) 思考以下程序为什么不能真正实现两个数的交换。
函数的交换不影响结果的交换
(2) 修改以上程序,使用指针做参数,使其真正实现两个数的交换。

#include<iostream.h>
void Swap(int *x,int *y)
{
	int t;
	t=*x;
	*x=*y;
	*y=t;
}
int main()
{
	int x=5,y=6;
	cout<<"交换前:";
	cout<<x<<","<<y<<endl;
	Swap(&x,&y);
	cout<<"交换后:";
	cout<<x<<","<<y<<endl;
	return 0;
}

输出结果:交换前:5,6
交换后:6,5

(3) 修改以上程序,使用引用做参数,使其真正实现两个数的交换。将(2)和(3)的程序对比,思考各自的特点。

#include<iostream.h>
void Swap(int &x,int &y)
{
	int t;
	t=x;
	x=y;
	y=t;
}
int main()
{
	int x=5,y=6;
	cout<<"交换前:";
	cout<<x<<","<<y<<endl;
	Swap(x,y);
	cout<<"交换后:";
	cout<<x<<","<<y<<endl;
	return 0;
}

输出结果:交换前:5,6
交换后:6,5
2. 编写程序,从堆内存中动态分配一个整型数组,初始化赋值后并打印出来。

#include<iostream>
using namespace std;
void allocate(int *pt,int len);
void main()
{
	int n,i;
	int *p=0;
	cout<<"请输入数组的长度:";
	cin>>n;	
	allocate(p,n);
	cout<<"输出数组:"<<endl;
	for(i=0;i<n;i++)
		cout<<p[i]<<"  ";
	cout<<endl;
	delete []p;
}
void allocate(int *pt,int len)
{
	pt=new int[len];
	if(pt==0)
	{cout<<"分配数组失败!"<<endl;
	exit(1);}
	for(int i=0;i<len;i++)
		pt[i]=0;
}

输出结果:请输入数组的长度:3
输出数组:
(1) 不使用函数,在主程序中实现动态数组分配和输出功能。

#include<iostream>
using namespace std;
void main()
{
	int n;
	int *p=0;
	cout<<"请输入数组的长度:";
	cin>>n;
	p=new int [n];
	if(p==0)
	{cout<<"分配数组失败!";
	exit(1);}
	for(int i=0;i<n;i++)
		p[i]=0;
	cout<<"输出数组:"<<endl;
	for(i=0;i<n;i++)
		cout<<p[i]<<"  ";
	cout<<endl;
	delete []p;
}

输出结果:请输入数组的长度:3
输出数组:
0 0 0
(2) 改进该程序,将动态分配数组及其初始化的操作封装成函数。

#include<iostream>
using namespace std;
void allocate(int *pt,int len);
void main()
{
	int n,i;
	int *p=0;
	cout<<"请输入数组的长度:";
	cin>>n;	
	allocate(p,n);
	cout<<"输出数组:"<<endl;
	for(i=0;i<n;i++)
		cout<<p[i]<<"  ";
	cout<<endl;
	delete []p;
}
void allocate(int *pt,int len)
{
	pt=new int[len];
	if(pt==0)
	{cout<<"分配数组失败!"<<endl;
	exit(1);}
	for(int i=0;i<len;i++)
		pt[i]=0;
}

输出结果:请输入数组的长度:3
输出数组:

思考以下程序为什么给p动态数组分配内存空间失败?
(2) 修改以上程序,使用指针做函数返回值,将被调函数执行时动态开辟的内存块首地址返回给主程序

#include<iostream>
using namespace std;
int *allocate(int len);
void main()
{
	int n,i;
	int *p=0;
	cout<<"请输入数组的长度:";
	cin>>n;	
	p=allocate(n);
	cout<<"输出数组:"<<endl;
	for(i=0;i<n;i++)
		cout<<p[i]<<"  ";
	cout<<endl;
	delete []p;
}
int *allocate(int len)
{
	int *pt=0;
	pt=new int[len];
	if(pt==0)
	{cout<<"分配数组失败!"<<endl;
	exit(1);}
	for(int i=0;i<len;i++)
		pt[i]=0;
	return pt;
}

输出结果:请输入数组的长度:3
输出数组:
0 0 0
(3) 修改以上程序,使用二级指针做函数形参,使其指向实参指针,通过形参指针间接的操作实参指针,使实参指针指向被调函数执行时动态开辟的内存块

#include<iostream>
using namespace std;
void allocate(int **pt,int len);
void main()
{
	int n,i;
	int *p=0;
	cout<<"请输入数组的长度:";
	cin>>n;	
	allocate(&p,n);
	cout<<"输出数组:"<<endl;
	for(i=0;i<n;i++)
		cout<<p[i]<<"  ";
	cout<<endl;
	delete []p;
}
void allocate(int **pt,int len)
{
	*pt=new int[len];
	if(*pt==0)
	{cout<<"分配数组失败!"<<endl;
	exit(1);}
	for(int i=0;i<len;i++)
		(*pt)[i]=0;
}

输出结果:请输入数组的长度:3
输出数组:
0 0 0
(4) 以上方法的缺点是程序显得不自然,可读性不好,修改以上程序,使用引用做形参,使形参是实参指针的别名,通过形参操作实参指针,程序更自然,可读性更好

#include<iostream>
using namespace std;
void allocate(int *&pt,int len);
void main()
{
	int n,i;
	int *p=0;
	cout<<"请输入数组的长度:";
	cin>>n;	
	allocate(p,n);
	cout<<"输出数组:"<<endl;
	for(i=0;i<n;i++)
		cout<<p[i]<<"  ";
	cout<<endl;
	delete []p;
}
void allocate(int *&pt,int len)
{
	pt=new int[len];
	if(pt==0)
	{cout<<"分配数组失败!"<<endl;
	exit(1);}
	for(int i=0;i<len;i++)
		pt[i]=0;
}

输出结果:请输入数组的长度:3
输出数组:
0 0 0
(6)采用模块化思想,将以上程序的其他功能也封装成函数,注意函数定义和函数调用时参数的设置

#include<iostream>
using namespace std;
void allocate(int *&pt,int len);void output(int *&pt,int len);

void main()
{
	int n,i;
	int *p=0;
	cout<<"请输入数组的长度:";
	cin>>n;
	allocate(p,n);
	output(p,n);
	delete []p;
}
void allocate(int *&pt,int len)
{
	pt=new int[len];
	if(pt==0)
	{cout<<"分配数组失败!"<<endl;
	exit(1);}
	for(int i=0;i<len;i++)
		pt[i]=0;
}
void output(int *&pt,int len)
{
	int i;
	cout<<"输出数组:"<<endl;
	for(i=0;i<len;i++)
	cout<<pt[i]<<"  ";
	cout<<endl;
}

输出结果:请输入数组的长度:3
输出数组:
0 0 0
(7)给以上程序完善得实用些,增加输入功能
四、心得体会:
1、通过比较指针与引用的不同使用,较好的理解了引用的方便性
2、通过比较使用指针与不使用,理解指针的优越性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值