C++对C的扩充-动态数组例子

该博客讨论了如何在C++中改进动态内存分配,包括将分配和初始化操作封装到函数中,使用指针返回值,二级指针参数以及引用参数。还展示了如何通过模块化实现输入、输出和内存管理的分离,最后增加了用户输入数组元素的功能。
摘要由CSDN通过智能技术生成

从堆内存中获取一个整型数组,赋值后并打印出来。

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值