定义结构类型 a 可以用typedef定义真正的结构类型 ■下面定义了名为Part的数据类型: typedef struct int number; char name [NAME LEN+1]; int on hand; Part; ■Part可以像内建数据类型一样使用: Part part1,part2; 声明结构标签和定义结构类型这两种方式都可使用, 但个别情况下只能使用结构标签,比如在声明链表结 构时 16
定义结构类型 可以用typedef定义真正的结构类型 下面定义了名为Part的数据类型: Part可以像内建数据类型一样使用: Part part1, part2; 声明结构标签和定义结构类型这两种方式都可使用, 但个别情况下只能使用结构标签,比如在声明链表结 构时 typedef struct { int number; char name[NAME_LEN+1]; int on_hand; } Part; 16
将结构用作函数参数 函数可以将结构用作参数或返回值 ■结构用作参数示例: void print_part(struct part p) printf("Part number:%d\n",p.number); printf("Part name:%s\n",p.name); printf("Quantity on hand:%d\n",p.on_hand); 调用示例: print_part(part1); 17
将结构用作函数参数 函数可以将结构用作参数或返回值 结构用作参数示例: 调用示例: print_part(part1); void print_part(struct part p) { printf("Part number: %d\n" , p.number); printf("Part name: %s\n", p.name); printf("Quantity on hand: %d\n" , p.on_hand); } 17
结构用作返回值 函数返回结构示例: struct part build part(int number,const char *name, int on hand) struct part p; p.number number; strcpy(p.name,name); p.on hand on hand; return p; build part调用示例: part1 build part(528,"Disk drive",10); 18
结构用作返回值 函数返回结构示例: build_part调用示例: part1 = build_part(528, "Disk drive", 10); struct part build_part(int number, const char *name, int on_hand) { struct part p; p.number = number; strcpy(p.name, name); p.on_hand = on_hand; return p; } 18
结构用作参数和返回值为传值语义 结构作为参数和返回值时遵循传值语义,即需要对结构进行拷 贝,以结构的副本作为实际的参数和返回值 传值使得大型结构的效率低下,可以改用指向结构的指针提高 效率 有时传递指针是强制的,比如文件操作函数需要的LE参数, 此时需要FLE*指针。因为FLE持有某个打开的文件的句柄等信 息,属于操作系统提供的资源,不可随意复制 在函数内部,结构可以用另一个结构进行初始化,但被初始化 的结构必须是自动变量 void f(struct part part1) struct part part2 part1; ) 19
结构用作参数和返回值为传值语义 结构作为参数和返回值时遵循传值语义,即需要对结构进行拷 贝,以结构的副本作为实际的参数和返回值 传值使得大型结构的效率低下,可以改用指向结构的指针提高 效率 有时传递指针是强制的,比如文件操作函数需要的FILE参数, 此时需要FILE*指针。因为FILE持有某个打开的文件的句柄等信 息,属于操作系统提供的资源,不可随意复制 在函数内部,结构可以用另一个结构进行初始化,但被初始化 的结构必须是自动变量 void f(struct part part1) { struct part part2 = part1; ... } 19
结构复合字面量(C99) 复合字面量可以on the fly的创建一个结构来使用,而 不用事先将结构存储在一个变量内 复合字面量创建的结构可用来作为参数、返回值以及 赋值应用 示例: print_part((struct part){528,"Disk drive",10 }) //or in assignments part1 (struct part)528,"Disk drive",10 } /or designated initialization print_part((struct part) on hand 10, name "Disk drive", number 528 }) 20
结构复合字面量(C99) 复合字面量可以on the fly的创建一个结构来使用,而 不用事先将结构存储在一个变量内 复合字面量创建的结构可用来作为参数、返回值以及 赋值应用 示例: print_part((struct part){ 528, "Disk drive", 10 }); // or in assignments part1 = (struct part) { 528, "Disk drive", 10 }; // or designated initialization print_part((struct part) { .on_hand = 10, .name = "Disk drive", .number = 528 }); 20