发布时间:2024-10-06 12:01
发现很多初学C语言编程的朋友搞不懂结构体的用法,于是简单介绍一下,以后就不用反复教了,预计十分钟你就可以学会。
结构体其实很简单,就是把多个变量打了个包,可以一起定义,一起使用。
比如一个学生有学号id,姓名name,性别男女,本来我们一个学生需要定义三个变量,但这里可以定义一个结构体,把这三个属性都包含进去,这样编程思路更清晰。
// 定义一个类型为struct Student的结构体
struct Student{
int id;
char name[20];
bool gender; //true代表男性,false代表女性
};
在主函数中,在定义的时候需要用大括号括住其中的值来初始化。也可以先定义,再用变量名加点加属性名
的方式来赋值。使用的时候,和赋值的方法完全一样,可以用变量名加点加属性名
的方式来获取到值。
int main(int argc, char** argv) {
struct Student s1 = {1001, \"xiaoming\", true};
struct Student s2;
s2.id = 1002;
strcpy(s2.name,\"xiaohong\");
s2.gender = false;
printf(\"s1.id:%d s2.id:%d\\n\", s1.id, s2.id);
return 0;
}
在定义结构体的时候,可以用typedef关键字同时对结构体进行重命名。因为定义出来的结构体默认类型前面需要加struct,使用不方便,所以可以这样:
// 定义一个类型为struct Student的结构体
typedef struct Student{
int id;
char name[20];
bool gender; //true代表男性,false代表女性
}Student;
这样使用的时候就可以直接用Student了。
int main(int argc, char** argv) {
Student s1 = {1001, \"xiaoming\", true};
Student s2;
s2.id = 1002;
strcpy(s2.name,\"xiaohong\");
s2.gender = false;
printf(\"s1.id:%d s2.id:%d\\n\", s1.id, s2.id);
return 0;
}
有了上面对Student的定义,我们可以创建一个结构体数组。和普通的类型一样,类型名+变量名+中括号和数字
即可,初始化的时候可以把结构体初始化和数组初始化结合起来,用双重大括号
。
Student students[20] = {
{1001, \"xiaoming\", true},
{1002, \"xiaohong\", false},
{1003, \"xiaolan\", false},
{1004, \"xiaogang\", true},
{1005, \"xiaomei\", false}
};
如果结构体中包含有指针类型,那么复制就有两种:
浅复制代码。
char *aname = (char*)malloc(10*sizeof(char));
strcpy(aname, \"test1\");
Student a = {1001, aname, true};
Student b;
b = a;
浅复制效果。
test1.name:test1 test2.name:test1
test1.name ptr:0000000000736AB0 test2.name ptr:0000000000736AB0
深复制代码。
char *aname = (char*)malloc(10*sizeof(char));
strcpy(aname, \"test1\");
Student a = {1001, aname, true};
Student b;
b = a;
b.name = (char*)malloc(10*sizeof(char));
strcpy(b.name, a.name);
深复制效果(看地址的倒数第二位,是不同的)。
test1.name:test1 test2.name:test1
test1.name ptr:0000000000BD6AB0 test2.name ptr:0000000000BD6AD0
和常规变量一样,当出了作用域之后,结构体的变量和数组会被自动销毁,但是,注意,结构体指针指向的空间,和结构体成员变量中的指针指向的空间,都不会被自动释放,需要手动释放。
手动释放结构体成员变量中指针指向的空间(尤其注意不要忘记数组,需要一个一个释放)。
char *aname = (char*)malloc(10*sizeof(char));
strcpy(aname, \"test1\");
Student a = {1001, aname, true};
... ...
free(a.name);
手动释放结构体指针指向的空间,记得先把内部包含的指针指向的空间释放掉。
Student *aptr;
aptr = (Student* )malloc(sizeof(Student));
... ...
free(aptr->name);
free(aptr);
总之,结构体只要会创建,会使用,会释放,你就已经掌握一大半了。更为复杂的情况是和指针结合,之后考虑再写文章详细讲解。
【文献研究】国际班轮航运的合作博弈:The coopetition game in international liner shipping
SpringBoot 实现 excel 全自由导入导出,性能强,用起来还特优雅
几行代码,轻松搞定 SpringBoot 接口恶意刷新和暴力请求!
vim 出现 Another program may be editing the same file. If this is the case 的解决方法
“超越” SQL 的数据查询语言“新秀”Top8:GraphQL、PRQL、WebAssembly上榜
ENVI软件|基于多源遥感影像的红树林范围提取1-数据获取及处理