结构名不是
起始位置的地址,而是结构的起始位置的数据。
结构名作为实参是值传递,为了提高效率,函数形参可定义为(const struct student * p)
方法一 struct student s; strcpy(s.name,"Johnny"); s.age=22;
方法二
struct student s={ .name="Johnny" ,.age=22;}
结构体类似数组,元素顺序排列,类型可以不相同,因此
以结构中最大的元素所占的字节数对齐,如 int a【10】;不是以数组而是以int元素对齐。对齐的基本单位是二的倍数
char a; short b;
char c;
int d;
short e;char f; //占16字节
a | b | ||
c | |||
d | |||
e | f |
对于结构嵌套,不是把被嵌套的结构当做一个整体,而是宏展开,按照原方法计算
struct A{
int a;
double b;
};
struct B{
struct A;
char c;
}; // 24字节
结构指针
struct * p=&b;
(*)p.属性 相当
于
p->属性
; b.属性
联合union是一个能在同一个存储空间存储不同类型数据的类型。
联合体所占的内存长度等于其最长成员的长度,也有叫做共用体。
联合体虽然可以有多个成员,但同一时间只能存放其中一种。
union variant{
int ivalue;
char cvalue;
double dvalue;
};
枚举类,定义一个取值(整型常量)可以列举的变量类型
enum spectrum { red, yellow, green, blue, white, black };
enum spectrum color;
color = black;
typedef enum {
red, yellow, green, blue, white, black
} Color;
Color color =red;
typedef 原类型名 新类型名(主要用在复杂数据类型的表示上或者是便于一次性修改类型,比如返回值是一个函数指针)
typedef char BYTE;
typedef char* (*STRCAT)(char* s1,char* s2)//对函数指针定义新类型名STRCAT,
#define BYTE char
1.typedef仅限于对类型起别名,有些define表示不了的类型
2.typedef是一条语句,解释由编译器,而不是预处理器执行,是不简单的宏替换,而是定义一种新的类型