从堆内存中获取一个整型数组,赋值后并打印出来。
#include <iostream>
using namespace std;
void main()
{ int n; // 定义数组元素的个数
int *p=0;
cout<< "please input the length of the array : ";
cin>>n;
p=new int[n];
if (p==0)
{ cout<< " allocate failure"<<endl;
exit(1);
} // 分配内存空间
for( int i=0;i<n;i++)
p[i]= 0;
cout<<"output the array : "<<endl;
for( i=0;i<n;i++)
cout<<p[i]<< " ";
cout<<endl;
delete []p; // 释放内存空间
}
1.改进该程序,将动态分配数组及其初始化的操作封装成函数。
思考以下程序为什么给p动态数组分配内存空间失败?
#include <iostream>
using namespace std;
void allocate(int *pt,int len);
void main()
{ int n; // 定义数组元素的个数
int i;
int *p=0;
cout<< "please input the length of the array : ";
cin>>n;
allocate(p,n);
cout<<"output the array : "<<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<< " allocate failure"<<endl;
exit(1);
} // 分配内存空间
for( int i=0;i<len;i++)
pt[i]= 0;
}
2.使用指针做函数返回值,将被调函数执行时动态开辟的内存块首地址返回给主程序
#include <iostream>
using namespace std;
int * allocate(int len);
void main()
{ int n; // 定义数组元素的个数
int i;
int *p=0;
cout<< "please input the length of the array : ";
cin>>n;
p=allocate(n);
cout<<"output the array : "<<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<< " allocate failure"<<endl;
exit(1);
} // 分配内存空间
for( int i=0;i<len;i++)
pt[i]= 0;
return pt;
}
3.使用二级指针做函数形参,使其指向实参指针,通过形参指针间接的操作实参指针,使实参指针指向被调函数执行时动态开辟的内存块
#include <iostream>
using namespace std;
void allocate(int **pt,int len);
void main()
{ int n; // 定义数组元素的个数
int i;
int *p=0;
cout<< "please input the length of the array : ";
cin>>n;
allocate(&p,n);
cout<<"output the array : "<<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<< " allocate failure"<<endl;
exit(1);
} // 分配内存空间
for( int i=0;i<len;i++)
(*pt)[i]= 0;
}
4.以上方法的缺点是程序显得不自然,可读性不好,使用引用做形参,使形参是实参指针的别名,通过形参操作实参指针,程序更自然,可读性更好
#include <iostream>
using namespace std;
void allocate(int * &pt,int len);
void main()
{ int n; // 定义数组元素的个数
int i;
int *p=0;
cout<< "please input the length of the array : ";
cin>>n;
allocate(p,n);
cout<<"output the array : "<<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<< " allocate failure"<<endl;
exit(1);
} // 分配内存空间
for( int i=0;i<len;i++)
pt[i]= 0;
}
5.采用模块化思想,将以上程序的其他功能也封装成函数,注意函数定义和函数调用时参数的设置
#include <iostream>
using namespace std;
void allocate(int * &pt,int len);
void output(int * &pt,int len);
void main()
{ int n; // 定义数组元素的个数
int *p=0;
cout<< "please input the length of the array : ";
cin>>n;
allocate(p,n);
output(p,n);
delete []p; // 释放内存空间
}
void allocate(int * &pt,int len)
{
pt=new int[len];
if (pt==0)
{ cout<< " allocate failure"<<endl;
exit(1);
} // 分配内存空间
for( int i=0;i<len;i++)
pt[i]= 0;
}
void output(int * &pt,int len)
{
int i;
cout<<"output the array : "<<endl;
for( i=0;i<len;i++)
cout<<pt[i]<< " ";
cout<<endl;
}
6.给以上程序完善得实用些,增加输入功能
#include <iostream>
using namespace std;
void allocate(int * &pt,int len);
void output(int * &pt,int len);
void input(int * &pt,int len);
void main()
{ int n; // 定义数组元素的个数
int *p=0;
cout<< "please input the length of the array : ";
cin>>n;
allocate(p,n);
output(p,n);
input(p,n);
output(p,n);
delete []p; // 释放内存空间
}
void allocate(int * &pt,int len)
{
pt=new int[len];
if (pt==0)
{ cout<< " allocate failure"<<endl;
exit(1);
} // 分配内存空间
for( int i=0;i<len;i++)
pt[i]= 0;
}
void output(int * &pt,int len)
{
int i;
cout<<"output the array : "<<endl;
for( i=0;i<len;i++)
cout<<pt[i]<< " ";
cout<<endl;
}
void input(int * &pt,int len)
{
int i;
cout<<"intput the array : "<<endl;
for( i=0;i<len;i++)
{
cout<<"pt["<<i<<"]:";
cin>>pt[i];
}
cout<<endl;
}