1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
//伸缩型数组成员必须是最后一个数组成员 //结构中必须至少有一个其他成员 //伸缩型数组就像普通数组一样被声明,除了它的方括号内是空的 #include <stdio.h> struct flex { int count; double average; double scores[]; //伸缩型数组成员 }; int main(int argc, char const *argv[]) { // 假设想要用scores表示含有5个double型数值的数组 struct flex * pf; pf = malloc(sizeof(struct flex) + 5 * sizeof(double)); return 0; } //union联合是一个能在同一存储空间(但不同时)存储不同类型数据的数据类型 #include <stdio.h> union hold { int digit; double bigfl; char letter; }; int main(int argc, char const *argv[]) { //编译器分配足够的空间以保存所描述的可能性的最大描述 union hold fit; //hold类型联合变量 最大可能double 8字节(根据操作系统) union hold save[10]; //10个联合变量的数组 10个8字节 union hold * pu; //指向hold类型变量的指针 union hold valA; valA.letter = 'R'; union hold valB = valA; //把一个联合初始化为另一个联合 union hold valC = {88}; //初始化联合的digit成员 union hold valD = {.bigfl = 118.2}; //指定初始化项目 fit.digit = 23; //把23存储在fit中,使用2个字节 fit.bigfl = 2.0; //清除23,存储2.0,使用8个字节 fit.letter = 'h'; //清除2.0,存储'h',使用1个字节 return 0; } //enum枚举 #include <stdio.h> enum spectrum {red, orange, yellow, green, blue, violet}; enum spectrum color; enum levels {low = 100, medium = 500, high = 2000}; enum feline {cat, lynx = 10, puma, tiger}; enum feline animal; int main(int argc, char const *argv[]) { color = blue; // 输出4 默认:0,1,2,3,4,5 printf("%d\n", color); enum levels level; level = low; // 输出100 printf("%d\n", level); animal = puma; // 输出11 printf("%d\n", animal); return 0; } // namespace命名空间 #include <stdio.h> // 结构标记、联合标记、枚举标记和普通变量的命名空间是不同的 // 所以在C中可以定义如下2个rect不会冲突,但是不要这么做 // 1.相同名字容易造成混乱 2.C++中不允许这么做 struct rect { double x; double y; }; int rect; int main(int argc, char const *argv[]) { return 0; } // typedef工具是一个高级数据特性,它使你能够为某一类型创建自己的名字 // 在这个方面,它和#define相似,但是它们具有3个不同之处 // 与#define不同,typedef给出的符号名称仅限于对类型,而不是对值 // typedef的解释由编译器,而不是预处理器执行 // 虽然它的范围有限,但在其受限范围内,typedef比#define更灵活 #include <stdio.h> int main(int argc, char const *argv[]) { // 自定义变量名BYTE(通常是大写)表示一个字符 typedef unsigned char BYTE; // 为一个已经存在的类型创建一个名字可能看起来没什么必要,然而这可能是有用的 // 比如time()的返回值是time_t类型,C标准规范应返回整数类型 // 但它留给具体的实现来决定到底是哪种整数类型 time_t time(time_t *); // 在一个系统上time_t可能是unsigned int,在另外个系统上可能是unsigned long // 只要包含了time.h头文件,程序就可以访问适当的定义 // 使用#define可以实现typedef的一部分功能 #define BYTE unsigned char // 但也有#define实现不了的功能 typedef char * STRING; STRING name,sign; //意思是 char * name, * sign; // 但如果这么做 #define STRING char * STRING name, sign; //将会被翻译成char * name, sign; // 可以对结构使用typedef typedef struct complex //使用typedef来命名一个结构是,结构的标记可以省去(complex可以不写) { float real; float imag; } COMPLEX; COMPLEX c1; // 把FRPTC声明为一个函数类型,返回一个指向含有5个元素的char数组的指针 typedef char(* FRPTC())[5]; return 0; } // [] () * 优先级、函数指针 #include <stdio.h> int main(int argc, char const *argv[]) { //[] () 具有相同的优先级(从左到右进行结合),高于 * 的优先级 int * risks[10]; //risks是一个指针数组(10个指针) int goods[12][50]; //12个具有50个int值的数组构成的数组 int (* rusks)[10]; //rusks是一个指向具有10个int值的数组的指针(1个指针) int * off[3][4]; //3个由4个指向int指针的数组构成的数组(12个指针) int (*uuf)[3][4]; //指向3x4的int数组的指针(1个指针) char * fump(); //返回指向char指针的函数 char (* frump)(); //指向返回char类型的函数的指针 char (* flump[3])(); //由3个指针组成的数组,每个指针指向返回char类型的函数 typedef int arr5[5]; typedef arr5 * p_arr5; typedef p_arr5 arrp10[10]; arr5 togs; //togs是一个由5个int组成的数组 p_arr5 p2; //p2是一个指向5个int组成的数组的指针 arrp10 ap; //ap是一个10个元素的指针数组,每个指针指向5个int组成的数组 // 指向函数的指针 要指出函数的返回类型和函数的参量类型 void ToUpper(char *); void ToLower(char *); int round(double); void (*pf) (char *); //pf是一个指向函数的指针 (char*)是函数的参量列表 void是返回类型 pf = ToLower; //合法,ToUpper是函数ToUpper()的地址 pf = ToLower; //合法,ToLower是函数ToLower()的地址 pf = round; //不合法,round是错误类型的函数 pf = ToLower(); //不合法,ToLower()不是地址 // 调用 语法1和语法2都可以 char mis[] = "Nina Metier"; (*pf)(mis); //语法1 (*pf)就是pf指向的函数 pf(mis); //语法2 pf就是函数名 // 将函数指针作为另一个函数的参数 void show(void (*fp)(char *), char * str); show(ToLower, mis); //可以传函数名,fp=ToLower show(pf, mis); //可以传函数指针,fp=pf return 0; } |