1.结构体类型
在C语言中,结构体是一种复合数据类型,也就是,一个数据类型中包含多种数据类型(包括复合数据类型)。其字节大小为所有成员函数所占大小之和。
结构体声明:
struct [结构体名]
{
数据类型 变量名;
…
数据类型 变量名N;
}[变量名][, 变量名 = {值1,…,值N}];
//标准定义结构体
struct tagStu
{
char name[1024];
int num;
}stu1, stu2 = { "张三",20 };
// 匿名结构体
struct
{
char name[1024];
int num;
}stu11, stu22 = { "张三",20 };
//结构体作为另一结构体的数据成员
struct tagScore
{
float n1;
float n2;
float n3;
};
struct tagStu1
{
char name[1024];
int num;
struct tagScore socre;
};
结构体变量的定义:
struct 结构体名 变量名 [={初始值}];
struct tagStu1 stu33 = { "李四",200,{100,200,300} };
struct tagStu1 stu44;
stu44 = stu33;//底层是memcpy(&stu44,&stu33,sizeof(struct tagStu1));
memcpy(&stu44,&stu33,sizeof(struct tagStu1));//无条件将stu33 的内存数据拷贝值stu44中,最后一个参数是复制的字节长度。
//C语言底层具体实现大致如下:
void memcpy(void* dest, void* src, int size)
{
for (int i = 0; i < size; ++i)
*(((unsigned char*)dest) + i) = *(((unsigned char*)src) + i);
}
访问结构体:
结构体变量名.成员变量名;
//匿名结构体访问方式
printf("%s,%d\n", stu22.name, stu22.num);
//标准结构体的访问方式
printf("%s,%d\n", stu33.name, stu33.num);
printf("%f,%f,%f\n", stu33.socre.n1, stu33.socre.n2, stu33.socre.n3);
2.结构体数组
数组中每个元素都是结构体,结构体数组是用来表示相同用数据类型的集合。
结构体数组的定义:
struct 结构体名 变量名[数组长度] [={初始值}];
struct tagStu1 stus[10] = { { "李四",200,{100,200,300} },{ "王五",200,{100,200,300} } };
访问方式:
数组名[下标].成员变量 = 值;
stus[0].name
stus[0].num = 700;
3.枚举类型
枚举类型在开发中使用的较多,常用它来代替,宏常量。
用途:增强代码可读性、标记当前物体等。
枚举是一个整数类型,只占4个字节。
枚举的声明:
enum [枚举名称]
{
枚举值名称 [=值],
枚举值名称 [=值],
枚举值名称 [=值],
};
TIPS:枚举值名称的值不能重复,并且如果在忽略的情况下自动+1。
enum EType
{
E_Wall = 100,
E_Food,
E_None,
};
枚举的访问:
enum 枚举名称 变量名 = 值;
enum EType e = E_Wall;
int a = sizeof(enum EType);//4
switch (e)
{
case E_Wall:
break;
case E_Food:
break;
case E_None:
break;
default:
break;
}
4.共用体
顾名思义,它是共享类型的,如果说,结构体类型是每个成员变量有单独的内存,而共用体类型则是使用相同的内存,注意以最大的单位申请内存,也就是说,不管你使用几字节内存,全部按最大的内存申请。
union Union
{
unsigned char arr[4];
int num;
};
union Union u;
u.num = 0xff00ff;
printf("%d %d %d", u.arr[0], u.arr[1], u.arr[2]);
int b = sizeof(union U);
5.结构体指针
结构体指针和普通指针类似,只不过,在访问成员变量的方式上有一些小区别。
结构体指针本质上是指针。
结构体指针的声明:
struct 结构体名称* 变量名;
struct tagStu* p = NULL;
p = malloc(sizeof(struct tagStu));
结构体指针的使用:
变量名->成员变量; / (*变量名).成员变量;
p->num = 200;
free(p);//释放指针
p = NULL;//置为空
TIPS:
野指针:指向无效的内存空间;
空指针: 指向NULL;
6.typedef 别名
用途:统一C和C++编码问题。
别名的声明:
typedef 原数据类型 别名名称;
typedef struct tagStu TStu;
TStu s1;
s1.num = 200;