桂 林 理 工 大 学
实 验 报 告
实验名称 函数的应用(补充按引用的参数传递) 日期 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、通过比较使用指针与不使用,理解指针的优越性。