结构
结构的声明格式如下:
struct id{
char first[10];
char last[10];
int age;
}; //别忘了右花括号后面的分号
1.和数组类似的是,结构变量可在定义时初始化,如:
struct id tae = { "aaa", "bbb", 10 };
同样的,这种初始化只能在定义时进行。若在定义之后的地方进行,编译器会报错;但可用匿名结构进行快速赋值,如:
struct id tae;
tae = { "aaa", "bbb", 10 }; //错误
tae = (struct id){ "aaa", "bbb", 10 }; //正确
2.与数组不同的是,结构变量之间可以直接赋值,如:
struct id tae = { "aaa", "bbb", 10 }, sam;
sam = tae; //可以,本质上是sam的每个成员都被赋成tae对应成员的值
3.结构变量(注意不是结构指针)作为函数参数时,属于值传递
我们需要牢记一点,和数组不同,一个结构变量的名字不是该结构的地址
4.如果需要一个结构来存储字符串,通常应用char数组而非char指针
5.结构的成员变量使用malloc是可行的,但如何正确进行sizeof、memcpy等操作还需要进一步研究
6.伸缩型数组成员
联合
联合的声明格式与结构类似,如:
union hold{
int digit;
double bigfl;
char letter;
};
联合与结构的不同在于:联合变量在同一时间只能存储一个值(有点像python中的变量),如
union hold fit;
fit.digit = 23; //把23存储在fit中
fit.bigfl = 2.0; //清除23,存储2.0
fit.letter = 'h'; //清除2.0,存储'h'
所以需要注意:结构中,点运算符用来指定成员变量(本质上指向不同内存区域);而联合中,点运算符是用来表示正在使用哪种数据类型(指向同一片内存)
编译器为联合变量分配足够的空间以保存可能的最大需要
枚举
枚举的声明格式如下:
enum spec{ red, green, blue, yellow, grey };
枚举创建一个新类型并指定它可以具有的值(实际上不限制)
1.枚举类型的目的是提高程序可读性
2.枚举列表中的元素(称为枚举常量)本质上是int常量,因此可用于设置数组大小或switch标签。上述enum spec的定义相当于:
#define red 0
#define green 1
......
#define grey 4
3.枚举常量默认从0开始递增,也可以手动设置,如:
enum spec color = red;
printf("%d\n", color); //打印0
color = yellow;
printf("%d\n", color); //打印3
enum another_spec { low = 100, mid = 500, high = 2000 }; //可以