C语言-结构体

举报
yd_221104950 发表于 2020/12/03 01:36:39 2020/12/03
【摘要】 使用结构体的好处 假设有一个函数: void getStudentProfile(const char* name,int age,int height,int weight,const char *hobby,const char* good,const char* school){} 每次调用时都要传递姓名、年龄、身高、体重、爱好、特长、学校名称等信息。调用时...

使用结构体的好处

假设有一个函数:

void getStudentProfile(const char* name,int age,int height,int weight,const char *hobby,const char* good,const char* school){}

每次调用时都要传递姓名、年龄、身高、体重、爱好、特长、学校名称等信息。调用时传值都很麻烦。在C语言里,我们可以用结构体包含这些数据,在调用时,直接传递结构体就可以了,如这样:

void info(struct student stu){}

  
 
  • 1

除了可以把整批数据封装在结构体中传递外,另一好处是修改结构体时,如增加一个成员,不需要修改使用它的函数。不但让代码更好阅读,还可以更好地应对变化 。

注意:结构体变量是结构本身的名字,而数组变量则是一个指针,另外在结构体里不能有方法

定义结构体

结构体(struct,struct是structured data type结构化数据类型的缩写)。结构体可以把不同类型的数据写在一起,封装成一个新的大数据类型。结构体成员的类型可以C语言支持的所有类型,包括结构体、枚举等。

定义结构体时,结构体只是一个模板,告知计算机数据类型有哪些,计算机并不会分配任何内存空间。只有在定义结构体变量时,计算机才会分配内存存放结构体实例。

结构体与数组相似,除了以下两点:

  1. 结构体的大小固定;
  2. 结构体中的数据都有名字。
  • 最基本定义格式
strcut 结构体名{
	类型1 变量名1;
	类型2 变量名2;
	...
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

定义student结构体,把姓名、年龄、身高、体重、爱好、特长、学校名称等信息封装在里面:

   struct student{ // const  修饰的变量初始化后不能再修改 const char *name; int age; int height; int weight; const char *hobby; const char *good; const char *school; };

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 嵌套定义,就是在结构体里可以再定义结构体:
   struct classone{ const char *className; // 结构体类型成员 struct student *stu; // 嵌套定义结构体 struct group{ const char *name; int count; } grp; };

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 定义匿名结构体,即没有名字的结构体,很多时候,有了别名就不需要结构体名了:
typedef struct { const char *name; int age;
} Employee;

  
 
  • 1
  • 2
  • 3
  • 4
  • 在此想特别指出一种情况:结构体成员的数据类型可以是它本身,如:
typedef struct Node{ char data; struct Node* lChild; struct Node* rChild;
} BinTNode;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

使用typedef定义结构体别名

typedef定义结构体别名,并使用别名定义结构体变量,如:

 typedef struct student{ const char *name; int age; int height; int weight; const char *hobby; const char *good; const char *school;
} HeighSchoolStudent;
HeighSchoolStudent stu1 = {"Tom",28,170,64,"reading","program","ZhungSun University"};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

初始化结构体

  • 方式一:与数组初始化相似,只需要保证每条数据按照它们在结构体中定义的顺序出现即可,如:
struct student stu = { "Tom", 28, 170, 64, "reading", "program", "ZhungSun University"
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

嵌套定义的结构体初始化:

struct classone class1 = {"class A",stu,{"group 1",12}};

  
 
  • 1

嵌套定义的结构还可以这样初始化(以下主要展示classone结构体成员stu的初始化):

struct student stu1 = {"Tom",28,170,64,"reading","program","ZhungSun University"};
struct student stu2 = {"Lucy",28,170,64,"reading","program","ZhungSun University"};
struct student stus[] = {stu1,stu2};
struct classone class1 = {"class A",stus,{"group 1",12}};

  
 
  • 1
  • 2
  • 3
  • 4
  • 方式二:给指定字段赋值,指定的字段可以不按顺序出现,没有指定字段赋值的部分,仍然需要在它原有的顺序上进行初始化,如:
struct student stu1 = { .name="Tom", .age=28, .height=170, 64, "reading", "program", "ZhungSun University"
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

访问结构体

使用 "."点运算符读取结构体的字段值。结构体只能按名字访问,不可以像数组那样使用下标的形式来读取,如:

   stu.name

  
 
  • 1

示例:
student.h

struct student{ const char *name; int age; int height; int weight; const char *hobby; const char *good; const char *school;
 };
void info(struct student stu);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

student.c

#include <stdio.h>
#include "student.h" void info(struct student stu){
	printf("Hello,I am %s,%d years old.I come from %s\n",stu.name,stu.age,stu.school);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

test.c:

#include <stdio.h>
#include "student.h"
int main(){ struct student stu = {"Tom",28,170,64,"reading","program","ZhungSun University"}; info(stu);
	return 0; }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

编译并运行:

~$ gcc student.c test.c -o stu
~$ ./stu
Hello,I am Tom,28 years old.I come from ZhungSun University

  
 
  • 1
  • 2
  • 3

结构体变量赋值

在C语言中,所有赋值都会复制数据。如果只想复制数据的引用,那应该赋指针,因为只有把变量在存储器中的位置告诉函数,函数才能更新保存在哪里的数据 。

当把一个结构体变量赋值给另一个结构体变量时,计算机会创建一个全新的结构体副本,也就是说计算机需要再分配一块存储空间,大小和原来一样,然后把每个字段都复制过去,如:

strcut student stu2 = stu;

  
 
  • 1

传递结构体指针的demo:
student.h

 typedef struct student{ const char *name; int age; int height; int weight; const char *hobby; const char *good; const char *school; }student; struct classone{ const char *className; student *stu; struct group{ const char *name; int count; } grp; }; void info(struct classone * clas); //形参是指针类型

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

student.c

   #include <stdio.h> #include "student.h" void info(struct classone *clas){ printf("Hello,I am %s,%d years old.I come from %s\n,I am group %s\n,There are %d students\n",clas->stu[0].name,clas->stu[0].age,clas->stu[0].school,clas->grp.name,clas->grp.count); }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

test.c

   #include <stdio.h> #include "student.h" int main(){ struct student stu1 = {"Tom",28,170,64,"reading","program","ZhungSun University"}; struct student stu2 = {"Lucy",28,170,64,"reading","program","ZhungSun University"}; struct student stus[] = {stu1,stu2}; struct classone class1 = {"class A",stus,{"group 1",12}}; info(&class1); //传递结构体变量的地址 return 0;
 }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

编译并运行:

  ~/Desktop/MyC$ gcc student.c test.c -o clas2 ~/Desktop/MyC$ ./clas2 Hello,I am Tom,28 years old.I come from ZhungSun University ,I am group group 1 ,There are 12 students

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

如果想让函数更新结构体变量,就应该传递结构体的地址或指针,否则只是将数据的副本复制给了函数。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/87257515

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。