在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

一、结构体的声明和定义

  在嵌入式系统中,对内存很敏感。所以在使用结构体时要注意“声明结构体类型”和“定义结构体变量”的区别。声明结构体类型只是指定了一个结构体的类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际的内存单元。
  声明一个结构体类型的一般形式为:
  struct 结构体名
  {成员列表};

  要定义结构变量,则一般形式是:
  struct 结构体名 结构体变量名;
  在使用结构体时要注意结构体类型名和结构体变量名。构体类型名相当于“int a”里面的int,结构体变量名相当于a。
  注意区分下面几个定义:

struct Student{         //声明结构体char name[20];      //姓名int num;            //学号float score;        //成绩
};

  声明一个结构体类型Student,此时未分配内存单元。

struct Student stu1;    //定义结构体变量

  定义一个结构体变量stu1,此结构体变量的类型为Student,此时为变量stu1分配了内存单元。

truct Student{        char name[20];       int num;             float score;
}stu1;                  //在定义之后跟变量名

  在声明一个结构体类型Student的时候也定义一个结构体变量stu1,此时为变量stu1分配了内存单元。

struct {                //没有结构名char name[20];       int num;            float score;
}stu1;

  使用匿名结构体来直接定义了一个结构体变量stu1,此时为变量stu1分配了内存单元。
  在结构体的定义中经常使用typedef,typedef struct 是为了使用结构体更方便。

typedef struct
{int no;char name[12];
}Student;

  此处定义了一个结构体类型,此时未分配内存单元。利用此结构体类型进行定义时不需要带struct,可直接定义。相当于先定义了一个匿名结构体,然后将该匿名结构体类型定义为别名Student。
  利用该结构体类型定义结构体变量的方法如下:

 Student stu1;    //定义结构体变量

  还有一种结构体定义方法如下:

typedef struct Student
{int no;char name[12];
}my_student;

  此处定义了结构体类型,并不分配内存变量。相当于定义了结构体类型Student,然后Student类型又定义为Stu1。利用该结构体类型定义结构体变量的方法可以有两种分别如下:

struct Student stu1;    //定义结构体变量
my_student stu2;//定义结构体变量

  下面这种定义方法是错误的

typedef struct Student
{int no;char name[12];
};

二、结构体指针

  当一个指针变量用来指向了一个结构变量,这个指针就成了结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。可以通过指针来访问结构变量。
  定义结构指针变量的一般形式:
struct 结构名 * 结构指针变量名

struct Student *pstu;       //定义了一个指针变量,它只能指向Student结构体类型的结构体变量

  结构指针变量的定义也可以与结构体的定义同时。而且它必须先赋值后使用。数组名表示的是数组的首地址,可以直接赋值给数组指针。但结构变量名只是表示整个结构体变量,不表示结构体变量的首地址,所以不能直接赋值给结构指针变量,而应该使用 & 运算符把结构变量的的地址赋值给结构指针变量。
  通过结构指针间接访问成员值,访问的一般形式:
(*结构指针变量). 成员名 或 结构指针变量 -> 成员名

(*pstu).name
pstu->name

C语言结构体的声明和定义相关推荐

  1. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  2. 【Struct(结构体)杂谈之二】名不正则言不顺---Struct(结构体)的声明、定义及初始化

    Struct(结构体)的声明.定义及初始化 上一篇里我们讲了为什么我们要引入Struct这个数据类型,我们了解到Struct是一种聚合数据类型,是为了用户描述和解释一些事物的方便而提出的,Struct ...

  3. 结构体struct声明、定义

    结构体是一种构造类型(结构体.数组.联合类型),结构体弥补了数组不能存储多种类型的缺陷(即结构体是由于相同类型或不同类的成员组成) 一般声明形式如: struct 结构体名称 { 成员列表 }; st ...

  4. 11【C语言 趣味算法】个人所得税问题(结构体应用):结构体的声明、定义结构体类型的三种方法等

    Contents 一.Review 二.New Problem:Personal income tax issues(个人所得税问题) 2.1 Description of the problem 2 ...

  5. C语言结构体的作用、定义、使用方法以及实例

    目前已学的数据类型:数组(1.所有数据的类型必须一致   2.访问数组的成员必须通过下标) 学籍管理系统:学生(姓名.学号.性别.年龄.成绩...) 飞机票订票系统:机票(订票时间.班号.起点.终点. ...

  6. C语言结构体的四种定义方式

    1.先定义结构体类型,再定义结构体变量 struct student{int age;char* name; };struct student stu;//stu为student的结构体变量 2.定义 ...

  7. linux中c语言结构体详解,Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  8. python展开 c函数中的宏预处理_Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  9. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )

    文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...

最新文章

  1. c++关于map的find和count的使用
  2. SQL的基本数据类型
  3. 描述一下普适计算时代中的计算机,《课程总结报告-普适计算及其应用》.doc
  4. Python:执行精确的浮点数运算
  5. LightOJ - 1409 Rent a Car(最小费用最大流)
  6. 常用android的smali注入代码,android smali代码注入 实战一
  7. python可视化图表工具_酷炫的可视化图表工具来帮忙 深度评测五大Python数据可视化工具...
  8. Android获取手机联系人或通讯录的基本信息(如姓名、电话)
  9. Java随机生成长宽的矩形_java – 将正方形或矩形分解为大量随机大小的正方形或矩形...
  10. Netbackup 7.6新增功能和优势
  11. 子乐云音乐播放器源码V1.2php源码
  12. mysql 半同步 插件_编写半同步复制插件
  13. matlab通用程序,三次样条差值-matlab通用程序
  14. android studio选中全部,android - Android Studio风格维度已全部处理,未选中一项 - 堆栈内存溢出...
  15. 汇编常用DOS命令调用
  16. 腾讯敏感词汇大全_腾讯数平精准推荐 | OCR技术之识别篇
  17. 汽车厂VIN码生成软件
  18. c++除法保留小数_小学数学整数和小数的应用题解答方法公式汇总,新学期必备...
  19. Divisible [数学]同余定理
  20. Springboot导出excel,合并单元格示例

热门文章

  1. 咬文嚼字一下、信与讯的区别
  2. 计算机网络专业英语内容,计算机网络专业英语词汇资料.doc
  3. 【光驱不停自动弹出 有什么方法可以解决】
  4. Mac M1通过VMWare Fusion安装Centos7记录(镜像和网络有大坑)
  5. 计算机编程方程求解的步骤,求解数学物理方程的计算机方法.ppt
  6. 2022年最新整理必背的Java面试题大全,背好了Offer在手
  7. twrp调整分区_让TWRP支持解密高通data分区
  8. 腾讯云点播播放器TCPlayer开发文档整理edusoho
  9. VISSIM COM接口
  10. python飞机大战功能模块图_python pygame实现飞机大战游戏