我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。

那么,当我们要做一个学生信息管理系统时,需要保存学生的姓名、学号、年龄等信息,该怎么做呢?

如当要保存三个学生的信息时,

方法一是:

char *name1,*name2,*name3;  // 三个学生的姓名
int num1,num2,num3;         // 三个学生的学号
int age1,age2,age3;         // 三个学生的年龄

方法二是:

// 创建结构体模板
struct student
{char *name;  // 学生名字int num;     // 学生学号int age;     // 学生年龄
};// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;

显然,方法二跟更清晰,因为它把name、num、age都集成在一个模板,要用的时候只要套用模板进行创建即可。这就是结构体。

什么是结构体
结构体(struct)是由一系列具有相同类型或不同类型的数据项构成的数据集合,这些数据项称为结构体的成员。如上面的student结构体包含三个成员,分别是name、num、age。

结构体是C语言中的一种构造类型。C语言的数据类型如下图:

结构体变量的定义方法

方法一:

// 创建结构体模板struct student
struct student{char *name;  // 学生名字int num;     // 学生学号int age;     // 学生年龄
};// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;

此处,student是结构体名,该名字是由任意定义的,但是尽量起个有意义的名称。其相当于一个模板,可以使用这个模板去定义变量stu1,stu2,stu3。定义的时候不要忘了struct。

方法二:

// 定义三个结构体变量stu1, stu2, stu3
struct{char *name;  // 学生名字int num;     // 学生学号int age;     // 学生年龄
}stu1, stu2, stu3;

相对于方法一,此处省略了结构体名。虽然更简洁了,但是因为没有了名字,后面就不能用该结构定义新的变量。

方法三:

// 给结构体模板struct student重新命名为student
typedef struct student{char *name;  // 学生名字int num;     // 学生学号int age;     // 学生年龄
}student;// 使用student创建三个结构体变量stu1, stu2, stu3
student stu1, stu2, stu3;

此处使用typedef为结构体模板struct student定义一个别名student,关于typedef的介绍移步至#define与typedef的区别?进行查看。使用typedef给结构体创建一个别名,这在实际编程用使用非常广泛,如STM32单片机固件库中,使用得很多,如下图:

初始化结构

初始化变量和数组如下:

int count = 0;
int arr[7] = {0,1,2,3,4,5,6};

结构体变量是否也可以这样初始化?是的,可以。与初始化数组的语法类似:

struct student stu1 = {"ZhengNianJun", // 名字:正念君520,            // 学号:52023              // 年龄:23
};

简而言之,我们使用在一对花括号中括起来的初始化列表进行初始化,各初始化项用逗号分隔。

为了让初始化项与结构中各成员的关联更加明显,我们让每个成员的初始化项独占一行。这样做只是为了提高代码的可读性,对编译器而言,只需要用逗号分隔各成员的初始化项即可。

C99和C11为结构提供了指定初始化器(designated initializer)。其初始化器使用点运算符和成员名。例如,只初始化student结构中的name成员,可以这样做:

struct student stu1 ={.name = "ZhengNianJun"
};

也可以按照任意顺序使用指定初始化器:

struct student stu1 ={.age = 24,.num = 520,.name = "ZhengNianJun"
};

另外,对特定成员的最后一次赋值才是它实际获得的值。例如,考虑如下代码:

struct student stu1 ={.num = 520,.name = "ZhengNianJun",1314
};

此时,赋给num的值应该是1314,因为它在结构声明中紧跟在name成员之后。新值1314取代了之前的520。

指定初始化器在实际编程中也很常用到。如在linux2.6.32.2源码的usb驱动中(路径为:linux-2.6.32.2\drivers\usb\storage\usb.c),有如下代码:

访问结构体成员

结构体成员的访问需要借助结构体成员运算符——点(.)。如:

student stu1; // 定义一个结构体变量stu1
stu1.name = "ZhengNianJun"; // 给stu1的成员name赋值
stu1.num = 520;             // 给stu1的成员num赋值
stu1.age = 23;              // 给stu1的成员age赋值

实例

#include <stdio.h>typedef struct student
{char *name;  // 学生名字int num;     // 学生学号int age;     // 学生年龄
}student;int main(void)
{student stu1;  // 定义一个结构体变量stu1/* 给结构体变量stu1的成员进行赋值 */stu1.name = "ZhengNianJun";stu1.num = 520;stu1.age = 23;printf("\n============================================\n");printf("My name is %s\n", stu1.name);printf("My num is %d\n", stu1.num);printf("My age is %d\n", stu1.age);printf("欢迎关注正念君编程学习笔记!\n", stu1.age);printf("============================================\n");return 0;
}

程序运行结果为:

结构体是一块很重要的内容,用得很多。关于结构体的内存对齐可查看往期笔记:【C语言笔记】结构体内存对齐问题

以上就是关于结构体的一些笔记,如有错误欢迎指出。谢谢!

欢迎微信扫描左侧二维码或者在微信搜索zhengnian-2018关注我的微信公众号查看更多编程学习笔记!

原文链接:https://blog.csdn.net/zhengnianli/article/details/87568902

【C语言笔记结构体】相关推荐

  1. c语言指针变量输出不了共用体,瘋子C语言札记(结构体/共用体/枚举篇)

    瘋子C语言笔记(结构体/共用体/枚举篇) (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student ...

  2. C语言学习笔记---结构体的定义和初始化

      在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理. 结构体定义   要使用结构体时,首先要进行结构体的声明.声明的形式如下: struct 结构体名{ 结构体所包含的变量} ...

  3. C语言之结构体和共用体

    C语言之结构体和共用体 算上这篇笔记加上之前的四篇笔记,C语言基础我们也就告一段落了,对于刚刚接触c语言的童鞋们来说,这些以及足够了,稍后我会发布数据结构,对于想要深入学习的童鞋可以继续关注.本人也算 ...

  4. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  5. C 语言编程 — 结构体的数据类型转换

    目录 文章目录 目录 数组类型强制类型转换为结构体 结构体之间的强制类型转换 数组类型强制类型转换为结构体 先看一个例子: #include <stdio.h>int main(void) ...

  6. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

  7. 【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

  8. C 语言中结构体强制转换--实验

    2019独角兽企业重金招聘Python工程师标准>>> 对于C语言中结构体强制转换做了如下实验, 或许可以解惑一些问题 对于结构体, 我理解的属性有: 成员的顺序, 成员的类型,成员 ...

  9. java接收c语言的结构体

    java接收c语言的结构体 DataInputStream inputStream = new DataInputStream(s.getInputStream()); int read = 0; i ...

最新文章

  1. linux共享磁盘给指定ip,Linux 磁盘挂载和mount共享
  2. keil添加hal库_使用Keil uVision5创建stm32 hal库项目过程
  3. 找不到java.vbs_无法找到脚本*.VBS的脚本引擎解决办法
  4. 电脑ping不通 plsql能连上_台式电脑不能上网手机却能连上wifi无线网络的解决方法...
  5. AOP—JVM SandBox—快速上手
  6. Android 默认Tab标签大小及间距修改
  7. “自启动”树莓派上的 .NET Core 3.0 环境
  8. 用递归方法判断字符串是否是回文(Recursion Palindrome Python)
  9. oopc——6.oopc的好处
  10. inner join on, left join on, right join on讲解
  11. pythondjango是干什么的_python django框架是什么?怎么使用?
  12. linux自动内存清理
  13. django模型多对一 多对多 一对一三种关系解读
  14. opencv 图片边缘渐变_opencv滤镜-PS羽化特效
  15. element UI 学习
  16. 微信小程序-UI控件的使用(1)
  17. Revit二开--批量修改视图范围(revit宏)
  18. 主机映射(域名与ip之间映射)
  19. Flutter 3.X二维码扫描功能
  20. 树莓派蓝牙与手机APP通信

热门文章

  1. golang 获取当天0点时间_golang使用webAssembly的方式
  2. pcl里面的法线估计
  3. 二叉树两节点距离java,求二叉树中两个节点的最远距离
  4. php强大的函数,PHP中一些功能强大却很少使用的函数
  5. python 异常回溯_关于python:在循环中捕获异常回溯,然后在脚本末尾引发错误...
  6. Leedcode7-binary-tree-postorder-traversal
  7. 【Linux】crontab定时任务配置全过程
  8. TP3.2.x判断手机端访问并设置默认访问模块的方法 - ThinkPHP框架
  9. pdf.js 文字丢失问题 .cmaps
  10. 查出数字字符字段中非数字字符的记录