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].namestus[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);//4switch (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;