动态申请内存——new 和 delete & _int128的IO

动态申请内存——new 和 delete & _int128的IO

一、动态申请内存——new 和 delete

 	int *p;//定义一个整型指针变量p
    p = new int;//动态分配一个整型储存空间,并将首地址赋给p
    *p = 10;
    cout<<*p<<endl;//释放指针p指向的储存空间
    delete p;

对比c,c中使用 malloc 和 free 进行内存的申请和回收,c++中的 new 和 delete 有如下优点:

  1. 使用 malloc 函数时必须使用 sizeof 函数来计算所需要的字节数,而 new 可以根据数据类型自动计算所要分配内存的大小,减少了错误的发生
  2. new 能够自动返回正确的指针类型,而不必像 malloc 函数那样,必须在程序中进行强制类型转换,才能使其返回正确的指针类型

使用说明:

1、new 为数组分配空间时,必须提供所有维的大小

int *p = new int[10];
int *q = new int[2][5];

2、new 可在简单变量分配内存的同时,进行初始化

int *p;
p = new int(99);//动态分配空间,并将99作为初始值赋给它

注:new 不能对动态分配的数组存储区进行初始化

3、释放动态分配内存的数组存储区

delete  []指针变量名

4、对动态分配是否成功进行检查

int *p;
p = new int;
if(!p){
	cout<<"allocation failure\n";
	reurn 1;
}
*p = 20;
cout<<*p;
delete p;

二、__int128_t的使用

是比long long 还大的数,由于它只重载了加减乘除等运算,所以需要手写输入输出。

补充:实际上,gcc是不支持 __ int128这种数据类型的,比如在codeblocks 16.01也是无法编译的,但是提交到大部分OJ上是可以编译且能用的。C/C++标准IO是不认识__int128这种数据类型的,因此要自己实现IO,其他的运算,与int没有什么不同。

输入函数:

void scan(__int128 &x) //输入
{
	x = 0;
	int f = 1;//作为一个判断正负号的标记
	char ch;
	if((ch = getchar()) == '-') f = -f;
	else x = x*10 + ch-'0';//返回它的ASCII码值
	while((ch = getchar()) >= '0' && ch <= '9')
		x = x*10 + ch-'0';//返回它的ASCII码值
	x *= f;
}

输出函数:

void _print(__int128 x) {
	if(x > 9) print(x/10);
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	putchar(x%10 + '0');
}
posted @ 2021-01-12 20:57  许君  阅读(324)  评论(0编辑  收藏  举报