C语言结构体的使用

结构体

定义:是用于存储不同类型或相同类型的元素的集合

  • 与数组的区别
    • 数组是一组相同类型元素的集合
    • 而结构体可以存放相同或不同类型元素的集合

特点:

  • 允许用户根据自己的需求来创建可用的数据类型

  • 用来处理复杂对象的 相当于java里面的类

定义结构体变量

使用struct关键字

先声明结构体类型,再定义结构体变量
1
struct 结构体名称 结构体变量1,结构体变量2...;
声明结构体类型并定义变量
1
2
3
4
struct 结构体名称{
//成员变量列表
//类型名 变量名;
}//结构体变量列表--全局的结构体变量列表;
无类型名直接定义结构体类型变量
1
2
3
4
struct {
//成员变量列表
//类型名 变量名;
}结构体变量列表;

举例

1
struct Teacher Teacher1,Teacher2;
1
2
3
4
struct Teacher{
int num;
char name[10];
}Teacher1,Teacher2;
1
2
3
4
struct{
int age;
char gender;
};

注:

结构体最后的分号一定要写

  • 定义结构体变量后,系统会为其分配内存空间
    • 区分:对于结构体类型,系统不为其分配内存空间,只对其变量分配相应的内存空间

初始化

形式

1
2
3
4
struct 结构体名称 结构体变量={内容};
struct 结构体名称{
//成员
}结构体变量;
直接为结构体变量赋予初值
1
2
3
4
struct Teacher{
int num;
char name[10];
}a={10,"李四"};
为某一个结构体变量成员赋予初值
1
struct Teacher c={.num=20};

其他为未初始化的内容

  • 数值型,系统初始化为0
  • 字符型,系统初始化为\0

注:

为结构体变量赋予初值时,可以不完全初始化

是为结构体变量初始化,不能为结构体类型初始化

调用结构体成员

  • 单个结构体
1
结构体变量名.成员名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
struct Peo {
char name[20];
char gender[5];
char tele[12];
};
struct Stu {
struct Peo p;
int num;
float f;
};
int main() {
struct Peo p1= {"张三","男","11111111111"};
printf("%s %s %s",p1.name,p1.gender,p1.tele);//张三 男 11111111111

但不能使用结构体变量名称来获取整个结构体中所有成员的值

  • 嵌套结构体

结构体里的成员可以是另一个结构体

1
结构体变量名1.结构体变量名2.成员名

只能一级一级的去找到最低级别的成员

注:

  • 结构体变量中的成员可以进行各类运算
    • 调用结构体时,我们采用“.”这个成员运算符,它的 优先级高于其余的运算符,在计算时,我们首先调用该成员的内容,再进行相关的操作

结构体数组

导入:结构体中可以存放各种类型的元素,当然数组类型的数据也能被存放

应用:对于多个对象的多个数据的运算

声明结构体数组
1
2
3
4
struct peo{
char name[50];
int age;
} person [3];
初始化结构体数组
1
2
3
4
5
struct peo{
{"tom",19};
{"bob",23};
{"linda",18};
} person [3];
结构体数组使用
1
结构体数组.成员
1
2
3
4
int i=0;
for(i=0;i<3,i++){
printf("%s %s",person[i].name,person[i].age);
}

结构体指针

指向结构体变量的指针

调用结构体变量中的成员——我们可以为一个函数传入该结构体变量的地址,表示结构体变量成员的第一项的地址,用结构体指针来接收,对该地址解引用后,访问它的属性值(作用与结构体变量一致),即可获取到该结构体变量中的成员

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Peo {
char name[20];
char gender[5];
char tele[12];
};
struct Stu {
struct Peo p;
int num;
float f;
};
struct Stu s= {{"李四","女",10,"18288947230"},1,99.0f};
//浮点数不能精确保存
struct Stu s= {{"李四","女",10,"18288947230"}};

指针调用

  • 结构体指针
    (*结构体指针变量名).成员名
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    struct Peo{
    char name[20];
    char gender[5];
    char tele[12];
    };
    int main(){
    struct Peo p1={"张三","男","11111111111"};
    struct Peo * p = NULL;
    P=&p1;
    printf("%d",(*p).name);//张三
    return 0;
    }

    注:

    不能省略*结构体指针变量名两端的括号,否则优先级将会变成先得到结构体变量的地址再调用属性

    上述结构体指针的调用可简写为

    结构体指针变量名->成员名
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    struct Peo {
    char name[20];
    char gender[5];
    char tele[12];
    };
    struct Stu {
    //结构体嵌套已存在的结构体
    struct Peo p;
    int num;
    float f;
    };
    void print(struct Peo* pc) {
    printf("%s %s %s ",pc->name,pc->gender,pc->tele);//结构体指针->成员变量
    }//张三 男 11111111111
    int main() {
    struct Peo p1= {"张三","男","11111111111"};
    print(&p1);
    return 0;
    }