优秀flash网站设计,深圳域名空间,小程序appid在哪里找,深圳软件公司招聘前面我们已经看到过一种用户#xff08;程序员#xff09;定义的数据类型#xff1a;结构。除此之外#xff0c;还有一些其它类型的用户自定义数据类型#xff1a; 定义自己的数据类型 (typedef) C 允许我们在现有数据类型的基础上定义我们自己的数据类型。我们将用关键字… 前面我们已经看到过一种用户程序员定义的数据类型结构。除此之外还有一些其它类型的用户自定义数据类型 定义自己的数据类型 (typedef) C 允许我们在现有数据类型的基础上定义我们自己的数据类型。我们将用关键字typedef来实现这种定义它的形式是 typedef existing_type new_type_name; 这里 existing_type 是C 基本数据类型或其它已经被定义了的数据类型new_type_name 是我们将要定义的新数据类型的名称。例如
typedef char C; typedef unsigned int WORD; typedef char * string_t; typedef char field [50];在上面的例子中我们定义了四种新的数据类型 C, WORD, string_t 和 field 它们分别代替 char, unsigned int, char* 和 char[50] 。这样我们就可以安全的使用以下代码
C achar, anotherchar, *ptchar1; WORD myword; string_t ptchar2; field name;如果在一个程序中我们反复使用一种数据类型而在以后的版本中我们有可能改变该数据类型的情况下typedef 就很有用了。或者如果一种数据类型的名称太长你想用一个比较短的名字来代替也可以是用typedef。 联合(Union) 联合(Union) 使得同一段内存可以被按照不同的数据类型来访问数据实际是存储在同一个位置的。它的声明和使用看起来与结构(structure)十分相似但实际功能是完全不同的
union model_name { type1 element1; type2 element2; type3 element3; . . } object_name;union 中的所有被声明的元素占据同一段内存空间其大小取声明中最长的元素的大小。例如
union mytypes_t { char c; int i; float f; } mytypes;定义了3个元素 mytypes.c mytypes.i mytypes.f 每一个是一种不同的数据类型。既然它们都指向同一段内存空间改变其中一个元素的值将会影响所有其他元素的值。 union 的用途之一是将一种较长的基本类型与由其它比较小的数据类型组成的结构(structure)或数组(array)联合使用例如
union mix_t{ long l; struct { short hi; short lo; } s; char c[4]; } mix;以上例子中定义了3个名称mix.l, mix.s 和 mix.c我们可以通过这3个名字来访问同一段4 bytes长的内存空间。至于使用哪一个名字来访问取决于我们想使用什么数据类型是long, short 还是 char 。下图显示了在这个联合(union)中各个元素在内存中的的可能结构以及我们如何通过不同的数据类型进行访问 匿名联合(Anonymous union) 在 C 我们可以选择使联合(union)匿名。如果我们将一个union包括在一个结构(structure)的定义中并且不赋予它object名称 (就是跟在花括号{}后面的名字)这个union就是匿名的。这种情况下我们可以直接使用union中元素的名字来访问该元素而不需要再在前面加 union对象的名称。在下面的例子中我们可以看到这两种表达方式在使用上的区别
unionanonymous union struct { char title[50]; char author[50]; union { float dollars; int yens; } price; } book; struct { char title[50]; char author[50]; union { float dollars; int yens; }; } book; 以上两种定义的唯一区别在于左边的定义中我们给了union一个名字price而在右边的定义中我们没给。在使用时的区别是当我们想访问一个对象(object)的元素dollars 和yens 时在前一种定义的情况下需要使用 book.price.dollars book.price.yens 而在后面一种定义下我们直接使用 book.dollars book.yens 再一次提醒因为这是一个联合(union)域dollars 和yens 占据的是同一块内存空间所以它们不能被用来存储两个不同的值。也就是你可以使用一个dollars 或yens的价格但不能同时使用两者。 枚举Enumerations (enum) 枚举(Enumerations)可以用来生成一些任意类型的数据不只限于数字类型或字符类型甚至常量true 和false。它的定义形式如下
enum model_name { value1, value2, value3, . . } object_name;例如我们可以定义一种新的变量类型叫做color_t 来存储不同的颜色 enum colors_t {black, blue, green, cyan, red, purple, yellow, white}; 注意在这个定义里我们没有使用任何基本数据类型。换句话说我们创造了一种的新的数据类型而它并没有基于任何已存在的数据类型类型color_t花括号{}中包括了它的所有的可能取值。例如在定义了colors_t 列举类型后我们可以使用以下表达式
colors_t mycolor; mycolor blue; if (mycolor green) mycolor red;实际上我们的枚举数据类型在编译时是被编译为整型数值的而它的数值列表可以是任何指定的整型常量 。如果没有指定常量枚举中第一个列出的可能值为0 后面的每一个值为前面一个值加1。因此在我们前面定义的数据类型colors_t 中black 相当于0 blue 相当于 1 green 相当于2 后面依此类推。 如果我们在定义枚举数据类型的时候明确指定某些可能值例如第一个的等价整数值后面的数值将会在此基础上增加例如 enum months_t { january1, february, march, april,may, june, july, august,september, october, november, december} y2k; 在这个例子中枚举类型months_t的变量y2k 可以是12种可能取值中的任何一个从january 到 december 它们相当于数值1 到 12而不是0 到 11 因为我们已经指定 january 等于1。