C++用指针动态分配空间——数组、数字
1、使用new关键字来分配内存
C++中的指针的真正用处是可以动态使用空间(内存)。C语言可以使用malloc函数来实现动态分配,其原理也是指针,但是C++有更好的方式——new关键字。
下面来试试这种新技术,在运行阶段为一个int值分配未命名的内存,并使用指针来访问这个值
int *pn = new int
new int告诉程序,需要适合存储int的内存,new运算符根据类型来确定需要多少字节的内存
分配内存通用格式如下:
typeName * pointer_name = new typeName;
需要在两个地方制定数据类型:用来制定需要什么样的内存和用来声明合适的指针
下面的实例程序演示了如何将new用于两种不同的类型。
//chapter4.17 use_new.cpp
#include <iostream>
using namespace std;
int main()
{
int nights = 1001;
int * pt = new int; //给pt指针一个新的int内存
*pt = 1001;
cout << "nights value = ";
cout << nights << ": location " << &nights << endl;
cout << "int ";
cout << "value = " << *pt << ": location = " << pt << endl;
double * pd = new double;
*pd = 10000001.0;
cout << "double ";
cout << "value = " << *pd << ": location = " << pd << endl;
cout << "location of pointer pd: " << &pd << endl;
cout << "size of pt = " << sizeof(pt);
cout << " : size of *pt = " << sizeof(*pt) << endl;
cout << "size of pd = " << sizeof(pd);
cout << " : size of *pd = " << sizeof(*pd) << endl;
return 0;
}
以下是程序的输出:
nights value = 1001: location 0x71fe34
int value = 1001: location = 0x1d1590
double value = 1e+007: location = 0x1d15b0
location of pointer pd: 0x71fe28
size of pt = 8 : size of *pt = 4
size of pd = 8 : size of *pd = 8
- 使用delete释放内存
C++可以用new来申请空间,但是内存空间会满的,所以另一个关键字出现了——delete,用来释放空间,用new申请过来的内存池被占用一部分,用完使用delete语句将其释放,防止内存占满,报废……
实例:
int * ps = new int;
... //执行操作
delete ps;
此实例可以将ps指针直接释放掉
乱使用delete是不安全的,下面列举一个指针的用法,和是否安全
int * ps = new int; //ok
delete ps; //ok
delete ps; //不ok因为ps已经删除
int jugs = 5;
int * pi = &jugs;
delete pi; //不行,不允许,内存没分配
- 使用new创建动态数组
其实数组就是指针!
还是用new关键字,malloc同样可以。
int * psome = new int [10]; //附10个下边空间
删除一个数组的时候也用delete,改成如下方法
delete [] psome;
通用分配格式:
type_name * pointer_name = new type_name [num_elements];
- 使用动态数组
如何使用呢?
先定义一个
int * psome = new int [10];
那么现在psome就是一个数组了
实例:
#include <iostream>
using namespace std;
int main()
{
double * p3 = new double[3]; //3个元素的数组
p3[0] = 0.2;
p3[1] = 0.5;
p3[2] = 0.8;
cout << "p3[1] is: " << p3[1] << ".
";
p3 += 1;
cout << "now p3[0] is:" << p3[0] << endl;
p3 -= 1;
delete [] p3;
return 0;
}
其中p3+=1这一句是可以将整个数组的所有地址加一,所以错位了p3[0]等于了原来的p3[1]
最后删除的时候,p3必须恢复(p3-=1)原状,才可以删除,否则有一个元素空了,会报错!
还可以用变量定义数组下标个数
例如
const int cc = 11;
int *p = new int[cc];
这样子定义数组的时候可以用指针了,不一定非用向量了,可以最节省空间!力扣刷题找到了新方法