动态申请内存——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 有如下优点:
- 使用 malloc 函数时必须使用 sizeof 函数来计算所需要的字节数,而 new 可以根据数据类型自动计算所要分配内存的大小,减少了错误的发生
- 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');
}