C++指针动态分配数组和数字-详细

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
  1. 使用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; //不行,不允许,内存没分配

  1. 使用new创建动态数组

其实数组就是指针!

还是用new关键字,malloc同样可以。

int * psome = new int [10]; //附10个下边空间

删除一个数组的时候也用delete,改成如下方法

delete [] psome;

通用分配格式:

type_name * pointer_name = new type_name [num_elements];

  1. 使用动态数组

如何使用呢?

先定义一个

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] << ".\n";

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];

这样子定义数组的时候可以用指针了,不一定非用向量了,可以最节省空间!力扣刷题找到了新方法