结构体:一种自己设计的全新数据类型,没有方法的类
- 如果没有选择使用
标记名
(emplopee),那么只能在定义时声明 - 在声明时编译器不为结构保留任何内存空间,而是建立了用于声明变量的一种新的数据类型
- 如果初始化的值的个数小于结构体中的成员数目,剩下的初始化为
0
(指针为NULL
) - 可以使用同种类型的其他结构变量进行赋值(必须要相同类型)
/* 声明一种新类型: employee*/
struct employee {
char name[50];
int age;
float salary;
}; //别忘记‘;’
struct employee x; //声明emplyee结构体类型的变量
x = {"Simon", 18, 200}; //初始化
访问结构体的成员变量
-
.
是直接访问,而不是指针(结构体在内存中连续存储)
struct employee x, y;
strcpy(x . name, "Norma Baker");
x.age = 34;
scanf("%f", &x.salary);
strcpy(y.name, "Robert Smith");
y.age = x.age + 5;
y.salary = 0.90 * x.salary;
结构体数组
struct employee {
char name[25];
int age;
float salary;
};
struct employee toy_dept[100];
//访问数组元素
toy_dept[i].salary = 70000.0;
strcpy(toy_dept[i].name, "Adam Smith");
scanf ("%d", &toy_dept[i].age);
结构体作为函数参数
struct Books {
char title[50];
char author[50];
} book;
/* function declaration */
void printBook( struct Books book );
结构体指针
struct Books {
char title[50];
char author[50];
} book1;
struct Books *struct_pointer;
struct_pointer = &book1;
//直接访问
printf("Book title : %s\n", (*struct_pointer).title);
//通过指针访问
printf( "Book title : %s\n", struct_pointer->title);
结构体中的Union(联合)
- 结构的各成员顺序排列存储,每个成员都有自己独立的存储位置,但
Union
变量的所有成员共享同片内存 -
Union
变量每个时刻里只能保存它的某一个成员的值
enum fig_type { CIRCLE, RECTANGLE, TRIANGLE } ;
struct figure {
double area, perimeter; //都有的属性
perimeter;
enum fig_type ins;
union {
double radius; //圆特有的属性
double a[2]; //矩形特有的属性
double b[3]; //三角形特有的属性
} param;
} fig1, fig2 ;
fig1.param.a[] = {2.0,3.0};
fig2.param.radius = 2.0;
typedef
typedef double * MATH; /* MATH – doubel指针 */
typedef char NAME[50];
NAME person; /* char person[50]; */
typedef struct employee EmpRec; /* EmpRec - employee结构体 */
EmpRec x, y;
内存中的存储
struct example {
char c;
int b;
} sample;
- 字长为两个字节的计算机可能会要求把sample的每一个成员从
字
的边界开始存放(字:存储数据的标准内存单元),这个特性和机器有关 - 可能会有空洞存在在内存中(空洞中的值不确定),图中有一个字节的空洞
- 所以结构体不能比较大小(空洞存在)