C语言中,使用结构体(struct) 来存放一组不同数据类型的数据.
举例理解, 如果定义一个人怎么定义: 有姓名,年龄,体重, 身高, …, 如果不使用结构体, 就需要对每个变量进行定义和初始化,
若把这些属性放到一个集合里,就成了结构体,
一. 定义形式
struct 结构体名{
成员变量1:
成员变量2:
...
};
// 特别注意最后的这个;不能少
结构体是一种集合, 它里面包含了多个变量和数组, 它们的类型可以相同,也可以不同.每个这样的变量或数组称为结构体的成员(member), 以学生为例
struct person{
char name[50];
int age;
int weight;
int height;
}
结构体在内存中以连续的顺序存储方式来存储, 但成员之间可能存在缝隙,
用sizeof可以得到结构体占用内存空间的大小., 但不一定是成员占用内存空间之和.
二. 结构体使用示例
- 以下经编译运行OK.
#include <stdio.h>
#include <string.h>
struct st_girl {
char name[10]; //姓名
int age; // 年龄
int height; //体重, 单位CM
char sc[30]; // 身材:
char yz[30]; //颜值
};
void main() {
struct st_girl queen; // 定义结构体变量-----------
memset(&queen, 0, sizeof(queen)); // 初始化结构体变量方法1
//memset(&queen, 0, sizeof(struct st_girl)); // 初始化结构体变量方法2
//对结构体的变量进行赋值
strcpy(queen.name, "武则天");
queen.age=18;
queen.height=168;
strcpy(queen.sc, "火辣");
strcpy(queen.yz, "漂亮");
// 结构体变量的使用
printf("姓名: %s\n", queen.name);
printf("age: %d\n", queen.age);
printf("height: %d\n", queen.height);
printf("sc %s\n", queen.sc);
printf("yz: %s\n", queen.yz);
// 结构体数组 在实际开发中, 很少使用这种结构, C++标准库的vector容器可以完全取代数组.--------------
struct st_girl princess[6]; // 定义元素为结构体的数组变量
memset(princess, 0, sizeof(princess)); // 初始化
// 赋值
strcpy(princess[0].name, "张三");
strcpy(princess[1].name, "李四");
// 调用
printf("princess[0]=%s\n", princess[0].name);
printf("princess[1]=%s\n", princess[1].name);
// 结构体指针 方法1------------------
// struct st_girl queen2;
// struct st_girl *pst;
// 结构体指针方法2 建议开发中使用这种方式.
struct st_girl *pst, queen2;
// 初始化
memset(&queen2, 0, sizeof(struct st_girl));
pst=&queen2;
// 对成员赋值
strcpy(pst->name, "王五");
// 调用
printf("结构体指针变量的使用pst->name=%s\n", pst->name);
// 结构体复制------------
struct st_girl stgirl1,stgirl2;
memset(&stgirl1,0, sizeof(struct st_girl));
memset(&stgirl2,0, sizeof(struct st_girl));
strcpy(stgirl1.name, "张三三");
stgirl1.age=18;
memcpy(&stgirl2, &stgirl1,sizeof(struct st_girl)); // 这个是重点,
printf("stgirl2.name=%s\n", stgirl2.name);
printf("stgirl2.age=%d\n", stgirl2.age);
}
三. 结构体作为函数的参数
结构体是多个变量的集合,作为函数参数时就可以传递整个集合, 也就是所有成员, 如果成员较多,函数参数的初始化和赋值的开销会很大, 影响程序运行的效率. 所以最好的办法就是传递结构体变量的地址.
四.两个库函数
- memset, 内存空间赋值函数,用来给某一块内存空间进行赋值
void *memset(void *s, int v, size_t n);
s 为内存空间地址, 一般是数组名或结构体的地址
v 为要填充的地址
n 为要填充的字节数, 一般使用sizeof
- bzero, 内存空间清零
void *bzero(void *s, int v);
s 为内存空间地址, 一般是数组名或结构体的地址
v 为要填充的地址
两个函数功能都一样, 看习惯.