1.用typedef声明一个短语代替冗长的struct成员声明
int main(void) { typedef struct Hores Hores; struct Hores { int age; int height; char name[20]; char father[20]; char mother[20]; }; Hores groups[3]; }
2.成员之间的复制是按值传递的,并不是按引用传递
#include <stdio.h> #include <string.h> #include <stdarg.h> int main(void) { typedef struct Hores Hores; struct Hores { int age; int height; char name[20]; char father[20]; char mother[20]; }; Hores groups[3]; strcpy(groups[0].name, "charleed"); groups[1] = groups[0]; printf("%d\n", sizeof(groups)); printf("%s\n", groups[0].name); printf("%s\n", groups[1].name); strcpy(groups[1].name, "alex"); printf("%s\n", groups[0].name); printf("%s\n", groups[1].name); return 0; }
输出:
204
charleed
charleed
charleed
alex
3.访问结构成员有两种运算符:
一个是“点运算符”,点运算符的左操作数一般是一个左值(也可以不是左值,但值必须是一个结构类型,参考左值一文的示例.5),也可以不是(具体参考《C语言核心技术》第5章:结构和联合的成员);
另一个是“箭头运算符”,箭头运算符的左操作数必须是一个指针;
4.结构指针访问成员属性语法
printf("The name is %s\n", (*phorse).name);
为什么不是
printf("The name is %s\n", (*phorse.name));
?
因为成员选择运算符(句点)的优先级高于取消引用指针运算符*。这个操作还有另一种方法,更容易理解。将上面的语句改写为:
printf("The name is %s\n", phorse->name);
5.结构成员必须都是完整类型,例如下面这个例子,如果成员是一个数组,而它不指定长度,就无法通过编译:
struct frame_1 { char name[]; };