0%

初识结构体

文章时效性提示

本文发布于 514 天前,部分信息可能已经改变,请注意甄别。

结构体类型声明

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

结构的声明:

1
2
3
4
5
struct tag
{
member-list;
}
variable-list;

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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是局部的结构体变量

1
2
3
4
5
6
7
8
9
10
11
12
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:参见

结构体成员的类型

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
}

打印的结果是:

1
2
3
abc
hello world
333.333000

结构体成员的访问

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

结构体传参

下例打印结构体数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}

或使用箭头操作符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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,直接通过指针,可以节约内存空间。