广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言 - 结构体、结构体数组、结构体指针和结构体嵌套
  • 424
分享到

C语言 - 结构体、结构体数组、结构体指针和结构体嵌套

c语言开发语言 2023-08-30 10:08:47 424人浏览 泡泡鱼
摘要

结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(name) :char [ ] 型性别(sex):c

结构体的意义

问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。
单个学生学籍的数据结构

  • 学号(num): int 型
  • 姓名(name) :char [ ] 型
  • 性别(sex):char 型
  • 年龄(age):int 型
  • 分数(score):float 型
    思考:如果有多个学生,该怎么定义,已学数据类型无法解决(已学的数据类型需要定义好多变量,不友好)。

概述

  • 正式:
    结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据被称为结构型数据的 “成员” ,其描述了一块内存区间的大小及解释意义。
  • 通俗:
    结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。

C语言中,定义结构体的语法格式如下:

struct 结构体名 {    类型 成员1;    类型 成员2;    // ...};

其中,结构体名是您自定义的结构体类型名称,可以根据需求进行命名。成员1成员2等表示结构体的成员变量,每个成员都有自己的类型和名称。

定义结构体后,可以使用该结构体类型创建结构体变量,并访问结构体的成员。访问结构体成员的语法是使用结构体变量名后跟成员名,中间使用点.进行连接。

结构体的使用

  • struct 结构体名 变量名

  • struct 结构体名 变量名 = {成员1值,成员2值…}

  • 定义结构体时顺便创建变量(这时候创建几个变量都可以,中间用逗号隔开,直接在创建的时候赋值也可以,例如:)

    struct student{  int num; //学号  char name[16];  //姓名  float score;  //成绩}stu5 = {1002,"lihua",89},stu6;
  • 如果只想给一部分数据赋值的话:

    struct 结构体名 变量名 = {.name = "cuiyi",.num = 111,};

下面是一个更完整的示例:

#include // 定义一个结构体struct Person {    char name[50];    int age;    float height;};int main() {    // 创建一个结构体变量    struct Person person1;    // 访问结构体的成员    strcpy(person1.name, "John");    person1.age = 25;    person1.height = 1.75;    // 输出结构体的成员    printf("Name: %s\n", person1.name);    printf("Age: %d\n", person1.age);    printf("Height: %.2f\n", person1.height);    return 0;}

在上述示例中,我们定义了一个名为Person的结构体,它包含了姓名、年龄和身高三个成员变量。然后,我们创建了一个名为person1的结构体变量,并给它的成员赋值。最后,使用printf函数输出结构体的成员值。

结构体数组

  • 作用:将自定义的结构体放入数组中方便维护
  • 语法:
    struct 结构体名 数组名[元素个数] = {{}, {}, …{}}
    示例:
#includestruct stu{char name[16];int age;float score;}s[3];int main(){struct stu s[3] = {{"zhangsan",18,500},{"lisi",18,530},{"wangwu",18,550}};int i;for (i = 0; i < 3; i++){printf("name=%s, age=%d, score=%f\n",s[i].name,s[i].age,s[i].score);}return 0;}

结构体指针

  • 作用:通过指针访问结构体的成员
  • 语法:struct 结构体名 *指针名;
  • 利用操作符->可以通过结构体指针访问结构体属性(比如s.name 有一个指针 ps 指向 s ,那么可以用 ps->name 代替 s.name

示例:
结构体数组和结构体指针

#includestruct stu{char name[16];int age;float score;}s[3];int main(){struct stu s[3] = {{"zhangsan",18,500},{"lisi",18,530},{"wangwu",18,550}};struct stu *ps = s;//定义一个指针指向结构体数组int i;for (i = 0; i < 3; i++){printf("name=%s, age=%d, score=%f\n",(*(ps+i)).name,(*(ps+i)).age,(*(ps+i)).score);}return 0;}

在上面的代码中,一定要记得 (*(ps+i)) 才是一个大括号里面的值,这样才能 .name .age .score 。

结构体嵌套结构体

  • 含义
    结构体中的成员可以是另一个结构体
  • 语法
struct 结构体名 {struct 结构体名 成员名;};

示例:

#include #include  struct person{    char name[16];    int age;    char sex;}; struct  student{    struct person stu;     float score;}; struct teacher{    struct person tea;    char phone[12];}; int main(int arGC, const char *argv[]){    struct student s;     strcpy (s.stu.name,"zhangsan");    s.stu.age = 12;    s.stu.sex = 'm';    s.score = 98;     printf("name = %s,age = %d, sex = %c, score = %f\n", s.stu.name, s.stu.age, s.stu.sex, s.score);     struct teacher t;    struct teacher *p = &t;     strcpy (p->tea.name, "lisi");    p->tea.age = 54; //注意这里操作符 -> 的用法    p->tea.sex = 'w';    strcpy (p->phone, "13112341234");     printf("name = %s,age = %d, sex = %c, score = %s\n", t.tea.name, t.tea.age, t.tea.sex, t.phone);         return 0;}

上述代码中,有一个部分用到了 p->tea.age 这种形式,这是因为p是指针,而 tea 只是一个普通变量,所以从 tea 出发不能用 ->,只有指针才可以使用这个操作符。

结构体大小

字节对齐

  • 含义
    字节对齐主要是针对结构体而言的,通常编译器会自动对其成员变量进行对齐,以提高数据存取的效率。(因为如果按照类型实际的大小来判断的话,那么需要判断很多次,这样对齐了以后有规律就不用判断了)
  • 作用
    • 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
    • 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

计算方法

  • 自身对齐 (这个数据类型大小是多少就是多少)
  • 默认对齐 (4字节)
  • 有效对齐 (在自身对齐和默认对齐之间选最小)
    在这里插入图片描述

规则(地址 / 有效地址) 必须是整数。

计算过程:

  1. 把结构体里每个变量的类型的自身对齐,默认对齐和有效对齐分别写出来;
  2. 以有效对齐为准写每个变量的地址,最开始那个变量的地址肯定是0,然后后面叠加,注意在这个过程中要遵从**<规则>**,比如图中的变量 b ,本来地址应该是 1 ,但是因为 1 / 4 不是整数,所以要扩充到 4 凑整,那么这个时候 变量 a 的地址浪费了 1 2 3 这三个地址,又因为 b 本身就是 4 个字节,所以它的地址是 4 5 6 7。 c 和 d 因为都可以整除有效对齐,所以每个都加 1 个字节就行;
  3. 最终看一下,有效对齐最大的是 4 ,所以每个都要以 4字节 对齐,则要在变量 d 的后面再补 2 个地址:10 和 11 (因为前面的 8 和 9 已经占了 2 个地址了,还差 2 个地址凑够 4 个地址)。
  4. 得出结果:结构体 A 的地址是 0~11 ,所以大小是 12 。

上述过程要注意:能不能整除只能决定每个变量开头的地址,具体要每一行的地址从开头的地址要写到几要看变量类型的 sizeof 是多少。比如有 double c,c的开头地址是 8 ,那么这个变量占的字节就是 8 9 10 11 12 13 14 15 这八个字节。

来源地址:https://blog.csdn.net/qq_44947439/article/details/132544620

--结束END--

本文标题: C语言 - 结构体、结构体数组、结构体指针和结构体嵌套

本文链接: https://www.lsjlt.com/news/382610.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言 - 结构体、结构体数组、结构体指针和结构体嵌套
    结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(name) :char [ ] 型性别(sex):c...
    99+
    2023-08-30
    c语言 开发语言
  • C语言结构体指针的具体使用
    目录什么是结构体指针?如何访问结构体成员?如何传递结构体指针作为参数?结构体指针数组在 C语言中,结构体指针是一种非常有用的数据类型,它可以让我们更方便地操作结构体。结构体指针可以指...
    99+
    2023-05-20
    C语言结构体指针
  • c语言结构体指针如何使用
    在C语言中,我们可以使用指针来操作结构体变量。首先,我们需要定义一个结构体类型,然后声明一个结构体变量。接下来,我们可以使用指针来操...
    99+
    2023-10-28
    c语言
  • C语言结构体指针引用详解
    目录指向结构体变量的指针指向结构体数组的指针结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。 指向结构体变量的指针 前面我们通过“结构体变量名.成员名”的方式引用结构...
    99+
    2022-11-12
  • C语言结构体指针案例解析
    写结构体指针前,先说一下 . 号和 -> 的区别 记得当初刚学C语言的时候,搞不清结构体的 . 号和 -> ,经常混淆二...
    99+
    2022-11-12
  • C语言结构体指针怎么引用
    这篇文章主要介绍“C语言结构体指针怎么引用”,在日常操作中,相信很多人在C语言结构体指针怎么引用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言结构体指针怎么引用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-25
  • C#结构体指针的用法
    本篇内容介绍了“C#结构体指针的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#语言有很多值得学习的地方,这里我们主要介绍C#解析结构...
    99+
    2023-06-17
  • c语言结构体指针数组怎么初始化
    在C语言中,结构体指针数组的初始化可以通过以下几种方式进行: 逐个初始化:通过逐个为每个元素赋值。例如: struct Pers...
    99+
    2023-10-27
    c语言
  • 解析C/C++指针、函数、结构体、共用体
    目录指针变量与地址指针与指针变量占内存空间指针运算指针 变量与地址 变量给谁用的变量是对某一块空间的抽象命名。变量名就是你抽象出来的某块空间的别名。指针就是地址。指向某个地址。 指针...
    99+
    2022-11-13
  • C语言结构体指针的示例分析
    这篇文章给大家分享的是有关C语言结构体指针的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。写结构体指针前,先说一下 . 号和 -> 的区别记得当初刚学C语言的...
    99+
    2023-06-20
  • 浅谈C语言结构体
    目录前言什么是结构体结构体类型的声明结构的自引用结构体变量的定义和初始化结构体的使用结构体内存对齐结构体传参总结前言 在C语言中,除了内置的许多数据类型,C语言还为我们提供了自定义的...
    99+
    2022-11-12
  • C语言超详细讲解指针与结构体
    目录本节目标初识指针1、内存与地址2、变量的地址3、指针变量4、指针的使用5、指针变量的大小初识结构体1、什么是结构体2、结构体的定义3、结构体的使用本节目标 理解内存与地址的相关概...
    99+
    2022-11-13
  • C语言struct结构体介绍
    目录structstruct的嵌套实验struct C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 下面是st...
    99+
    2022-11-13
  • C语言结构体struct详解
    目录结构体的概念结构体类型的声明结构体变量的创建typedef关键字结构体的嵌套结构体变量的初始化结构体成员的访问结构体的传参总结结构体的概念 结构体是由一系列具有相同类型或不同类型...
    99+
    2022-11-13
  • 如何分析C/C++指针、函数、结构体和共用体
    如何分析C/C++指针、函数、结构体和共用体,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。指针变量与地址变量给谁用的变量是对某一块空间的抽象命名。变量名就是你抽象出来的某块...
    99+
    2023-06-28
  • C#中怎么定义结构体指针
    本篇文章为大家展示了C#中怎么定义结构体指针,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#结构体指针之C#结构体的定义:[StructLayout(LayoutKind.Sequential)]...
    99+
    2023-06-18
  • c语言结构体数组如何赋值
    要赋值C语言结构体数组,可以通过以下几种方式:1. 逐个赋值:使用赋值运算符(=)逐个为数组中的每个元素赋值。```cstruct ...
    99+
    2023-08-08
    c语言
  • Linux的file结构体和inode结构体怎么用
    本篇内容介绍了“Linux的file结构体和inode结构体怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. file 结构体fil...
    99+
    2023-06-27
  • go语言结构体指针操作的方法
    本篇内容介绍了“go语言结构体指针操作的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!指针指针是代表某个内存地址的值。内存地址储存另一个...
    99+
    2023-06-30
  • C++结构体详解
    目录一、结构体的定义二、创建具体的变量(3种)三、结构体数组四、结构体指针五、结构体嵌套结构体六、结构体做函数参数1、值传递2、地址传递七、结构体中const使用场景总结一、结构体的...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作