学学习网 手机版

学学习网

学习路径: 学习首页 > 应用开发 > c++ >

第五节 数组 (Arrays)(9)

设置字体:
----------------------------------

int (* minus)(int,int) = subtraction;
这里似乎解释的不太清楚,有问题问为什么(int int)只有类型,没有参数,就再多说两句。

这里 int (*minus)(int int)实际是在定义一个指针变量,这个指针的名字叫做minus,这个指针的类型是指向一个函数,函数的类型是有两个整型参数并返回一个整型值。
整句话“int (*minus)(int,int) = subtraction;”是定义了这样一个指针并把函数subtraction的值赋给它,也就是说有了这个定义后minus就代表了函数subtraction。因此括号中的两个int int实际只是一种变量类型的声明,也就是说是一种形式参数而不是实际参数。
 
 
5.4 动态内存分配 Dynamic memory
到目前为止,我们的程序中我们只用了声明变量、数组和其他对象(objects)所必需的内存空间,这些内存空间的大小都在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入来决定必需的内存空间,那么我们该怎么办呢?
答案是动态内存分配(dynamic memory),为此C++ 集成了操作符new 和delete。
  操作符 newdelete 是C++执行指令。本节后面将会介绍这些操作符在C中的等价命令。
 
 
操作符new new[ ]
操作符new的存在是为了要求动态内存。new 后面跟一个数据类型,并跟一对可选的方括号[ ]里面为要求的元素数。它返回一个指向内存块开始位置的指针。其形式为:
pointer = new type
或者
pointer = new type [elements]
第一个表达式用来给一个单元素的数据类型分配内存。第二个表达式用来给一个数组分配内存。
例如:
int * bobby;
bobby = new int [5];
在这个例子里,操作系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给bobby。因此,现在bobby 指向一块可存储5个整型元素的合法的内存空间,如下图所示。

你可能会问我们刚才所作的给指针分配内存空间与定义一个普通的数组有什么不同。最重要的不同是,数组的长度必须是一个常量,这就将它的大小在程序执行之前的设计阶段就被决定了。而采用动态内存分配,数组的长度可以常量或变量,其值可以在程序执行过程中再确定。
动态内存分配通常由操作系统控制,在多任务的环境中,它可以被多个应用(applications)共享,因此内存有可能被用光。如果这种情况发生,操作系统将不能在遇到操作符new 时分配所需的内存,一个无效指针(null pointer)将被返回。因此,我们建议在使用new之后总是检查返回的指针是否为空(null),如下例所示:
int * bobby;
bobby = new int [5];
if (bobby == NULL) {
// error assigning memory. Take measures.
};
 
删除操作符delete
既然动态分配的内存只是在程序运行的某一具体阶段才有用,那么一旦它不再被需要时就应该被释放,以便给后面的内存申请使用。操作符delete 因此而产生,它的形式是:
delete pointer;

delete [ ] pointer;
第一种表达形式用来删除给单个元素分配的内存,第二种表达形式用来删除多元素(数组)的内存分配。在多数编译器中两种表达式等价,使用没有区别, 虽然它们实际上是两种不同的操作,需要考虑操作符重载overloading 。
// rememb-o-matic
#include ‹iostream.h›
#include ‹stdlib.h›

int main ( ) {
char input [100];
int i,n;
long * l;
cout << "How many numbers do you want to type in? ";
cin.getline (input,100); i=atoi (input);
l= new long[i];
if (l == NULL) exit (1);
for (n=0; n<i; n++) {
cout << "Enter number: ";
cin.getline (input,100);
l[n]=atol (input);
}
cout << "You have entered: ";
for (n=0; n<i; n++) {
cout << l[n] << ", ";
delete[] l;
return 0;
}
How many numbers do you want to type in? 5
Enter number : 75
Enter number : 436
Enter number : 1067
Enter number : 8
Enter number : 32
You have entered: 75, 436, 1067, 8, 32,
这个简单的例子可以记下用户想输入的任意多个数字,它的实现归功于我们动态地向系统申请用户要输入的数字所需的空间。
----------------------------------
课程列表
重点难点
赞助链接