C++ new用法

感觉现在没有总结性的特别全面的new的用法,其实new是一个非常非常好用的功能,它的功能非常接近底层,可以最大限度地节约空间(它的基本操作比栈操作慢,但是通过new进行的数组功能操作等比栈快)。

基本操作

首先来了解new的基本操作:

data_type *ptr1=new data_type;
data_type *ptr2=new data_type();
data_type *ptr3=new data_type[];
data_type *ptr4=new() data_type;
data_type *ptr5=new() data_type();
data_type *ptr6=new() data_type[];

其中的data_type可以是struct自定义的结构体,也可以是基本的数据类型(不包括string)。

new还分为new和new():new的作用是按照操作系统和编译器的规则在堆分区内选择,申请并初始化空间为0;new()的作用是指定一个地址,在指定的地址申请空间,但是它仅仅是申请空间,没有其他作用。

如果new()的括号中填的是一个栈地址,那就把这块栈空间归为堆中(这种操作没有问题,所谓的栈和堆其实只是数学建模下的数据结构,但是为了程序的严谨,通常new()的括号中不填栈地址)。

int stack_data;
int *stack_data_ptr=&stack_data;
int *heap_ptr_data=new(stack_data_ptr) int;

new后紧随的是data_type,data_type()和data_type[]:data_type是一般的申请,就是完全按照以上提到的new和new()的规则来;data_type()是申请并自定义初始化,括号内的值就是初始化的值;data_type[]是申请连续的内存空间(即数组),[]内的值可以是变量或常量表达式(如果直接开数组,就只能填常量表达式),它决定了开辟多少个连续的内存空间。

而以上六种new的使用方法,最终都会返回一个指针,为申请的空间的地址(如果是data_type[]的话,就是首个元素的地址)。

需要强调的是,new只是单纯的空间操作,因此,它也可以为指针申请内存空间,但是为指针申请的内存空间就必须用指向指针的指针来保存。这是一个很重要的特性,下文开多维数组需要用到它:

int **a=new int*;

根据以上代码可以得出结论,new开的数据类型后有n个星号,new返回的指针就需要(n+1)个星号表示。

关于数组的进阶功能

先来了解一下数组的原理:

一维数组,就是一块连续的可以存储多个数据的内存空间,数组名就是一个指针,指向数组的第一个元素。

 二维数组,就是存储着一维数组的数组,显然,它并不是通过倍数来分析这到底是第几行第几列,它是一个指针数组,每一个指针都是一个一维数组的数组名,而所谓的第n行m列的元素,其实就是第n个一维数组的第m个元素。

先不急着研究怎么开二维数组,先看看对于一维数组的扩容操作

int n=5;
int m=10;
int *arr=new int[n];
arr=new(arr) int[m];
for(int i=0;i<10;i++)
{
    cin>>arr[i];
    cout<<arr[i]<<" ";
}

如果不执行第4行代码,就会内存溢出,但因为它是堆内存,所以理论上不会造成重大错误。

然后看看多维数组,这里以二维数组为例,创建一个(n*m)的的二维数组。

#include <iostream>
using namespace std;

int main()
{
	int n=5,m=10; 
	int **arr=new int*[n];
	for(int i=0;i<n;i++)
		cout<<arr[i]<<" ";
	cout<<endl;
	for(int i=0;i<n;i++)
		arr[i]=new int[m];
	for(int i=0;i<n;i++)
		cout<<arr[i]<<" ";
	cout<<endl;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			arr[i][j]=i+j;
			cout<<arr[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

以上代码的运行结果为:

0 0 0 0 0
/*new数组自动初始化为0*/
0x956f30 0x956fa0 0x957010 0x957080 0x9570f0
/*二维数组存储的是一维数组,一维数组通过指向第一个元素的指针访问,new会返回指针*/
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10 11 12
4 5 6 7 8 9 10 11 12 13
/*输出*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值