初识结构体

结构体类型声明

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构的声明:

12345
struct tag{	member-list;}variable-list;

struct:结构体关键字
tag:结构体标签
struct tag:结构体类型
member-list:结构体成员
variable-list:变量列表

例如描述一个学生:
——名字、年龄、电话、性别

12345678910111213
struct Stu{    char name[20];    short age;    char tele[12];    char sex[5];}s1,s2,s3;//s1,s2,s3是3个全局的结构体变量(尽量少使用) int main() {    struct Stu s;//s是局部的结构体变量    return 0;}

s1,s2,s3是3个全局的结构体变量(尽量少使用)
s是局部的结构体变量

123456789101112
typedef struct Stu{    char name[20];    short age;    char tele[12];    char sex[5];}Stu; int main() {    Stu s2;    return 0;}

typedef struct Stu{...}Stu意思是把struct Stu重新取名字叫Stu
有关typedef:参见

结构体成员的类型

可以是标量、数组、指针或其他结构体

结构体变量的定义和初始化

12345678910111213
typedef struct Stu{    char name[20];    short age;    char tele[12];    char sex[5];}Stu; int main() {    Stu s1 = {"张三",20,"18888888888","男"};    struct Stu s2 = {"李四",99,"12345678900","女"};    return 0;}
123456789101112131415161718192021222324
struct S{    int a;    char c;    char arr[20];    double d;}; struct T{    char ch[10];    struct S s;//结构体里包含了另一个结构体    char *pc;}; int main(){    char arr[] = "def";    struct T t = {"abc",{100,'w',"hello world",333.333},arr};    printf("%s\n",t.ch);    printf("%s\n",t.s.arr);    printf("%lf\n",t.s.d);    return 0;}

打印的结果是:

123
abchello world333.333000

结构体成员的访问

结构体变量访问成员,是通过点操作符(.)访问的。

结构体传参

下例打印结构体数据:

123456789101112131415161718192021
typedef struct Stu{    char name[20];    short age;    char tele[12];    char sex[5];}Stu; void print1(Stu s){    printf("name : %s\n",s.name);    printf("age : %d\n",s.age);    printf("telephone : %s\n",s.tele);    printf("sex : %s\n",s.sex);} int main() {    Stu s1 = {"张三",20,"18888888888","男"};    print1(s1);    return 0;}

或使用箭头操作符

1234567891011121314151617181920
typedef struct Stu{    char name[20];    short age;    char tele[12];    char sex[5];}Stu; void print2(Stu* ps){    printf("name : %s\n",ps->name);    printf("age : %d\n",ps->age);    printf("telephone : %s\n",ps->tele);    printf("sex : %s\n",ps->sex);}int main() {    Stu s1 = {"张三",20,"18888888888","男"};    print2(&s1);    return 0;}

print2的函数性能优于print1,直接通过指针,可以节约内存空间。

🔍 ×