NULL是C++库中定义的一个常量,专门设计用来指代空指针的。如果这个常量没有被预先定义,你可以自己定以它为0: #define NULL 0 在检查指针的时候,0和NULL并没有区别。但用NULL 来表示空指针更为常用,并且更易懂。原因是指针很少被用来比较大小或被直接赋予一个除0以外的数字常量,使用NULL,这一赋值行为就被符号化了。 ANSI-C 中的动态内存管理Dynamic memory in ANSI-C 操作符new 和delete 仅在C++中有效,而在C语言中没有。在C语言中,为了动态分配内存,我们必须求助于函数库stdlib.h。因为该函数库在C++中仍然有效,并且在一些现存的程序仍然使用,所以我们下面将学习一些关于这个函数库中的函数用法。 函数malloc 这是给指针动态分配内存的通用函数。它的原型是: void * malloc (size_t nbytes); 其中nbytes 是我们想要给指针分配的内存字节数。这个函数返回一个void*类型的指针,因此我们需要用类型转换(type cast)来把它转换成目标指针所需要的数据类型,例如: char * ronny; ronny = (char *) malloc (10); 这个例子将一个指向10个字节可用空间的指针赋给ronny。当我们想给一组除char 以外的类型(不是1字节长度的)的数值分配内存的时候,我们需要用元素数乘以每个元素的长度来确定所需内存的大小。幸运的是我们有操作符sizeof,它可以返回一个具体数据类型的长度。 int * bobby; bobby = (int *) malloc (5 * sizeof(int)); 这一小段代码将一个指向可存储5个int型整数的内存块的指针赋给bobby,它的实际长度可能是 2,4或更多字节数,取决于程序是在什么操作系统下被编译的。 函数calloc calloc 与malloc 在操作上非常相似,他们主要的区别是在原型上: void * calloc (size_t nelements, size_t size); 因为它接收2个参数而不是1个。这两个参数相乘被用来计算所需内存块的总长度。通常第一个参数(nelements)是元素的个数,第二个参数 (size) 被用来表示每个元素的长度。例如,我们可以像下面这样用calloc定义bobby: int * bobby; bobby = (int *) calloc (5, sizeof(int)); malloc 和calloc的另一点不同在于calloc 会将所有的元素初始化为0。 函数realloc 它被用来改变已经被分配给一个指针的内存的长度。 void * realloc (void * pointer, size_t size); 参数pointer 用来传递一个已经被分配内存的指针或一个空指针,而参数size 用来指明新的内存长度。这个函数给指针分配size 字节的内存。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要求。在这种情况下,指针当前所指的内存中的数据内容将会被拷贝到新的地址中,以保证现存数据不会丢失。函数返回新的指针地址。如果新的内存尺寸不能够被满足,函数将会返回一个空指针,但原来参数中的指针pointer 及其内容保持不变。 函数 free 这个函数用来释放被前面malloc, calloc 或realloc所分配的内存块。 void free (void * pointer); 注意:这个函数只能被用来释放由函数malloc, calloc 和realloc所分配的空间。 5.5 数据结构 (Data Structures) 一个数据结构是组合到同一定义下的一组不同类型的数据,各个数据类型的长度可能不同。它的形式是: struct model_name { type1 element1; type2 element2; type3 element3; . . } object_name; 这里model_name 是一个这个结构类型的模块名称。object_name 为可选参数,是一个或多个具体结构对象的标识。在花括号{ }内是组成这一结构的各个元素的类型和子标识。 如果结构的定义包括参数model_name (可选),该参数即成为一个与该结构等价的有效的类型名称。例如: struct products { char name [30]; float price; }; products apple; products orange, melon; 我们首先定义了结构模块products,它包含两个域:name 和 price,每一个域是不同的数据类型。然后我们用这个结构类型的名称 (products) 来声明了 3个该类型的对象:apple, orange 和melon。 一旦被定义,products就成为一个新的有效数据类型名称,可以像其他基本数据类型,如int, char或 short 一样,被用来声明该数据类型的对象(object)变量。 |