C语言学习之结构体

简介: C语言学习之结构体

前言

640.jpg


自去年毕业工作以来,C语言的学习都停留在入门阶段,实际应用中只使用到了数组、函数、循环、选择、位运算这些基本的知识,较少用到指针、预处理、结构体、枚举类型、文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言的使用,所以最近几篇文章是关于这些内容的,一方面是巩固自己的C语言编程能力,另一方面也为以后学习C++做准备。


什么是结构体

C语言的结构体实际上就是一种特殊的数据类型,只不过这种数据类型包括了很多个基本类型的数据,如int、float、char等等,如在开发学生成绩管理系统时,有学号、姓名、院系、班级、年龄、各个科目、各个科目对应的成绩等,不使用结构体我们需要定义许多的变量,而使用结构体可以大大简化程序的设计。


结构体类型的定义

结构体的定义格式为:

struct 结构体名称
{
    结构体所包含的成员变量;
}


与C++不同的是,C语言的结构体只能包括成员变量,不能包含成员函数,但可以定义函数指针指向一个函数。


定义一个名为student的结构体类型,包含id、name、score这3个成员变量。

struct student
{
    int id;
    char *name;
    float score;
};


定义两个student的结构体变量:

struct student lucy, jack;


当然,也可以在定义结构体的同时定义结构体变量:

struct student
{
    int id;
    char *name;
    float score;
}lucy, jack;


即把变量名放在定义结构体的最后即可。


如果只需要定义lucy、jack两个结构体变量,后面其他地方都不需要再定义新的结构体变量,那么结构体名可以省略,不建议使用这种方式:

struct 
{
    int id;
    char *name;
    float score;
}lucy, jack;


这种写法看起来是稍微简单了一些,但后面无法再定义新的结构体变量。


结构体变量在内存中的存储

理论上和数组元素的存储非常类似,结构体变量的存储也是连续存储的,但在实际的编译器实现过程中,各个成员变量之间可能会存在缝隙。


结构体变量

【示例】:

#include "stdio.h"
#include "stdlib.h"
struct student
{
    int id;
    char *name;
    float score;
};
struct student jack;
int main(void)
{
    //成员的赋值
    jack.id = 1234;
    jack.name = "jack";
    jack.score = 89.5;
    printf("%s id: %d, score: %.1f \r\n", jack.name, jack.id, jack.score);      
    return 0;
}


【输出结果】:

jack id: 1234, score: 89.5


  1. 当然,也可以在定义的时候整体赋值:
struct student lucy, jack = {1233, "jack", 92.6};


但不可以在定义之后,单独整体赋值;

struct student lucy;
lucy = {1233, "lucy", 92.6};


这种整体赋值不允许,会报错。


结构体数组

当然也允许定义结构体数组:

struct student cls[5];


定义的数组可以不指定数组大小。

【示例】:

#include "stdio.h"
#include "stdlib.h"
struct student
{
    int id;
    char *name;
    float score;
};
//定义的同时整体赋值
struct student cls[5] =     //也可以不给出数据大小: cls[]
{
    {1001, "Li Lei", 88.4},
    {1002, "Zhang Wei", 79.3},
    {1003, "Wang Ming", 70.8},
    {1004,"Zhao Yang", 80.5},
    {1005,"Li Liang", 89.5}
};
int main(void)
{
    int i;
    int num_80 = 0; //分数大于80的人数
    float average = 0, sum = 0;     //平均分和总和
    for(i = 0; i < 5; i++)
    {
        sum += cls[i].score;
        if(cls[i].score > 80)
            num_80++;
    }
    average = sum / 5.0;
    printf("分数大于80的人数:%d,总平均分:%.1f", num_80, average);  
    return 0;
}


【输出结果】:

分数大于80的人数:3,总平均分:81.7


结构体指针变量

定义格式为:

struct student *p;


【示例一】:

#include "stdio.h"
#include "stdlib.h"
struct student
{
    int id;
    char *name;
    float score;
};
//定义的同时整体赋值
struct student *pstu, stu = {1234, "lucy", 90.4};
int main(void)
{
    pstu = &stu;        //*pstu 等同于 stu
    printf("id: %d, name: %s, score: %.1f \n", stu.id, stu.name, stu.score);
    printf("id: %d, name: %s, score: %.1f \n", (*pstu).id, (*pstu).name, (*pstu).score);
    printf("id: %d, name: %s, score: %.1f \n", pstu->id, pstu->name, pstu->score);  //指针变量引用成员变量
    return 0;
}


【输出结果】:

id: 1234, name: lucy, score: 90.4
id: 1234, name: lucy, score: 90.4
id: 1234, name: lucy, score: 90.4


【示例二】

#include "stdio.h"
#include "stdlib.h"
struct student
{
    int id;
    char *name;
    float score;
};
struct student *ps;
struct student cls[] =
{
    {1001, "Li Lei", 88.4},
    {1002, "Zhang Wei", 79.3},
    {1003, "Wang Ming", 70.8},
    {1004,"Zhao Yang", 80.5},
    {1005,"Li Liang", 89.5}
};
int main(void)
{
    int len = sizeof(cls) / sizeof(struct student);    //求数组长度
    printf("id \t name \t score \n");
    for(ps = cls; ps < cls + len; ps++)
    {
        printf("%d \t %s \t %.1f \n", ps->id, ps->name, ps->score);
    }
    return 0;
}


【输出结果】:

id       name    score
1001     Li Lei          88.4
1002     Zhang Wei       79.3
1003     Wang Ming       70.8
1004     Zhao Yang       80.5
1005     Li Liang        89.5
目录
相关文章
|
13天前
|
程序员 C语言
【C语言】初步认识结构体
【C语言】初步认识结构体
15 0
|
29天前
|
C语言
C语言结构体内存对齐
C语言结构体内存对齐
|
3天前
|
存储 编译器 C语言
[C语言]自定义类型(结构体~枚举~联合体)
[C语言]自定义类型(结构体~枚举~联合体)
|
9天前
|
存储 算法 程序员
【C言专栏】C 语言结构体的应用与实践
【4月更文挑战第30天】C语言中的结构体是自定义数据类型的关键,它组合不同类型的數據以创建新类型,尤其适合处理复杂对象如学生信息。通过定义结构体如`struct Student`,包含名字、学号和成绩,可以方便地实例化和访问成员。结构体在链表实现、函数参数传递和数组中都有广泛应用,如表示链表节点和处理批量数据。理解并熟练运用结构体对于C语言编程至关重要,能提升代码效率和可读性。
|
14天前
|
编译器 Linux C语言
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
|
16天前
|
存储 C语言
C语言中定义结构体类型变量的深入探索
C语言中定义结构体类型变量的深入探索
8 0
|
23天前
|
存储 C语言
结构体(C语言)
结构体(C语言)
|
29天前
|
存储 C语言
C语言自定义类型结构体详解
在C语言中,结构体是复合数据类型,能组合不同类型的数据显示。定义结构体用`struct`关键字,如`struct Student {char name[20]; int age; float score;};`。声明结构体变量如`struct Student stu1;`,访问成员用`.`操作符,如`stu1.age = 20;`。初始化可直接赋值`struct Student stu1 = {&quot;李四&quot;, 22, 85.5};`。结构体数组如`struct Student stuArray[3]`,结构体指针如`struct Student *pStu = &stu1;`。
7 0
|
1月前
|
存储 安全 网络协议
自定义类型-结构体,联合体和枚举-C语言
自定义类型-结构体,联合体和枚举-C语言
|
1月前
|
存储 搜索推荐 编译器
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别