举个简单的例子来说,您可以在程序中以动态的方式来配置一个int类型大小的内存,例如:
int *ptr = new int;
在这段程序中,new运算符会配置一个int所需要的空间,并传回该空间的地址,所以您使用指针ptr来储存这个地址,这段程序只配置空间但不初始空间中的储存值,如果要在配置完成后指定储存值,则可以如此定义:
int *ptr = new int(100);
这段程序在配置空间之后,会将空间中的储存值设定为100,以下使用一个简单的程序来示范动态配置的使用:
#include <iostream>
using namespace std;
int main() {
int *ptr = new int(100);
cout << "空间位置:" << ptr
<< endl;
cout << "空间储存值:" << *ptr
<< endl;
*ptr = 200;
cout << "空间位置:" << ptr
<< endl;
cout << "空间储存值:" << *ptr
<< endl;
delete ptr;
return 0;
}
执行结果:
空间位置:0x3d2458
空间储存值:100
空间位置:0x3d2458
空间储存值:200
使用new运算符动态配置的空间,在整个程序结束前并不会自动归还给内存,您必须使用delete将这个空间还给内存,如上面的程序在结束前所作的动作,在这个程序中,虽然显示完毕后程序也就结束,但这边还是示范delete的用法,而这也是个好习惯,日后您的程序在持续执行过程中若大量使用new而没有适当的使用delete的话,由于空间一直没有归还,最后将导致整个内存空间用尽。
接下来看一个简单的易失存储器配置的应用,您知道数组使用的一个缺点,就是数组的大小必须事先决定好,然而有时候您无法知道我们会使用多大的数组,或者希望由用户自行决定数组大小,这时候您就可以使用易失存储器配置加上指针运算来解决这个问题,先说明数组动态配置的方式,如下所示:
int *arr = new int[1000];
这段程序代码动态配置了1000个int大小的空间,并传回空间的第一个地址,配置后的空间数据是未知的,没有方法在动态配置数组空间后同时定义元素初值。
同样的,使用new配置得来的空间,在不使用时应该使用delete归还给内存,方法如下:
delete [] arr;
注意在使用delete归还数组空间给内存时,我们必须加上[ ],表示归还的是整个数组空间。
下面这个程序是个数组动态配置的简单示范:
#include <iostream>
using namespace std;
int main() {
int size = 0;
cout << "请输入数组长度:";
cin >> size;
int *arr = new int[size];
cout << "指定元素值:" << endl;
for(int i = 0; i < size; i++) {
cout << "arr[" << i << "] = ";
cin >> *(arr+i);
}
cout << "显示元素值:" << endl;
for(int i = 0; i < size; i++) {
cout << "arr[" << i << "] = " << *(arr+i)
<< endl;
}
delete [] arr;
return 0;
}
执行结果:
请输入数组长度:5
指定元素值:
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
显示元素值:
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
您也可以使用指针来仿真二维数组,只要清楚二维数组中的两个维度的索引值之位移量就可以了,这在 二维数组 中有谈到了,下面这个程序是个简单的示范:
#include <iostream>
using namespace std;
int main() {
int m = 0;
int n = 0;
cout << "输入二维数组维度:";
cin >> m >> n;
int *ptr = new int[m*n];
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
*(ptr + n*i + j) = i+j;
}
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cout << *(ptr+n*i+j) << "\t";
}
cout << endl;
}
delete [] ptr;
return 0;
}
执行结果:
输入二维数组维度:4 5
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7