复合类型
结构体
结构体中的成员空间是独立的,没有空间,只有大小
定义
// stu结构体,相当于一个模具
struct stu
{
int num; // 不要赋值
char name[16];
int age;
}; // 一定要有分号
结构体变量的定义
// 方法一:定义结构体同时定义变量
struct stu
{
int num;
char name[16];
int age;
}lucy; // lucy为结构体变量
// 方法二:定义结构体后定义变量
struct stu
{
int num;
char name[16];
int age;
};
struct stu lucy; // 结构体变量
初始化与赋值
#include <stdio.h>
struct stu
{
int num;
char name[16];
int age;
}lucy = {1,"Lucy",13}; // 初始化
int main()
{
// 数据必须和成员顺序一样
struct stu bob = {2,"BOb",14}; // 初始化
bob.age = 15; // 赋值
printf("lucy.name = %s
bob.age = %d
",lucy.name,bob.age);
return 0;
}
lucy.name = Lucy
bob.age = 15
两个相同结构体变量可以直接用来赋值
struct stu
{
int num;
char name[16];
int age;
};
struct stu bob,lucy;
lucy = {1,"Lucy",14};
bob = lucy; // 直接用同类型结构体赋值
结构体数组
#include <stdio.h>
#include <string.h>
struct stu
{
int num;
char name[16];
int age;
};
int main()
{
struct stu arr[5];
memset(arr,0,sizeof(arr));
printf("请输入5个学生信息:
");
for (size_t i = 0; i < 5; ++i)
{
scanf("%d %s %d",&arr[i].num,&arr[i].name,&arr[i].age);
}
int sum;
for (size_t i = 0; i < 5; ++i)
{
sum += arr[i].age;
}
printf("平均年龄:%.2f
",(double)sum / 5.0);
return 0;
}
请输入5个学生信息:
1 Bob 13
2 Lucy 14
3 Jack 12
4 小李 11
5 小王 14
平均年龄:17.40
结构体嵌套结构体
结构体指针
#include <stdio.h>
#include <string.h>
struct stu
{
int num;
char name[16];
int age;
};
int main()
{
struct stu lucy;
struct stu *p = NULL;
memset(&lucy,0,sizeof(lucy));
p = &lucy;
printf("请输入数据:");
scanf("%d %s %d",&p -> num, &p -> name, &p -> age);
printf("lucy.age = %d
p -> age = %d
lucy.name = %s
p -> name = %s
lucy.num = %d
p -> num = %d
",
lucy.age,
p -> age,
lucy.name,
p -> name,
lucy.num,
p -> num);
return 0;
}
请输入数据:1 Lucy 14
lucy.age = 14
p -> age = 14
lucy.name = Lucy
p -> name = Lucy
lucy.num = 1
p -> num = 1
结构体空间在堆区
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct stu
{
int num;
char name[16];
int age;
};
int main()
{
struct stu *p = NULL;
p = (struct stu *)malloc(sizeof(struct stu));
memset(p,0,sizeof(struct stu));
scanf("%d %s %d",&p -> num, &p -> name, &p -> age);
printf("num = %d
name = %s
age = %d
",p -> num,p -> name,p -> age);
if (p != NULL)
{
free(p);
p = NULL;
}
return 0;
}
1 Jack 14
num = 1
name = Jack
age = 14
堆区的结构体数组
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct stu
{
int num;
char name[16];
int age;
};
int main()
{
int n;
printf("请输入学生个数:");
scanf("%d",&n);
struct stu *arr = NULL;
arr = (struct stu *)malloc(n * (sizeof(struct stu)));
for (size_t i = 0; i < n; ++i)
{
printf("请输入第%d个学生数据:",i + 1);
scanf("%d %s %d",&arr[i].num, &arr[i].name, &arr[i].age);
}
for (size_t i2 = 0; i2 < n; ++i2)
{
printf("num = %d, name = %s, age = %d
",(arr + i2) -> num, (arr + i2) -> name, (arr + i2) -> age);
}
if (arr != NULL)
{
free(arr);
arr = NULL;
}
return 0;
}
请输入学生个数:3
请输入第1个学生数据:1 Lucy 13
请输入第2个学生数据:2 Jack 14
请输入第3个学生数据:3 Bob 15
num = 1, name = Lucy, age = 13
num = 2, name = Jack, age = 14
num = 3, name = Bob, age = 15
结构体成员为指针
// 例1:C语言实现“类”
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct people
{
int money;
void (*makemoney)(struct people *people1);
};
static void __makemoney(struct people *people1)
{
people1 -> money += 1000;
}
int main()
{
struct people people1 = {100,__makemoney};
printf("money:%d
",people1.money);
people1.makemoney(&people1);
printf("money:%d
",people1.money);
return 0;
}
money:100
money:1100
结构体在堆区,成员也指向堆区
内存对齐
文章来源于编程珠玑 ,作者守望先生
共用体
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
union data
{
int a;
int b;
int c;
};
int main()
{
printf("大小:%d
",sizeof(union data));
union data data1;
data1.a = 1;
data1.b = 3;
data1.c = 10;
printf("a = %d
sum = %d
",data1.a,data1.a + data1.b + data1.c);
return 0;
}
大小:4
a = 10
sum = 30
共用体虽然共用一段空间,但成员能使用空间的大小由成员自身类型决定
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
union data
{
int a;
short b;
char c;
};
int main()
{
printf("大小:%d
",sizeof(union data));
union data data1;
data1.a = 0x01020304;
printf("a = %#x
b = %#x
c = %#x
",data1.a,data1.b,data1.c);
return 0;
}
大小:4
a = 0x1020304
b = 0x304
c = 0x4
枚举
将要赋的值一一列出来
定义:
enum 名称 {枚举列表};
例:
#include <stdio.h>
enum BOOL {True = 1,False = 0};
int main()
{
enum BOOL flag = True;
if (flag)
{
printf("True
");
}
return 0;
}
True
typedef
为已有的类型取一个别名
#include <stdio.h>
typedef int Int32; // 给int取别名
typedef enum BOOL {True = 1,False = 0}Bool; // 给枚举取别名
typedef struct
{
Int32 num; // 相当于int num;
}stu;
stu student;
int main()
{
Bool flag = True;
if (flag)
{
printf("True
");
}
return 0;
}