在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. java 根据ip获取mac地址_利用java如何根据IP获取mac地址
  2. Google首页电吉
  3. yaml 文件格式简介
  4. 语音识别真的比肩人类了?听听阿里iDST初敏怎么说
  5. 利用素数表快速寻找 n 以内的所有素数
  6. Oracle 中使用 fetch bulk collect into 批量效率的读取
  7. Eclipse android
  8. php event loop,理解javascript中的事件循环(Event Loop)
  9. error: field 'b' has imcomplete type
  10. java中 8进制 10进制 2进制 16进制 相互转换
  11. IAR 下C中嵌入汇编
  12. [转]面试官,不要再问我三次握手和四次挥手
  13. ps制作20种特效文字_用PS制作裂、火、电特效——电
  14. 数据库为date型,而前端要显示String型,问题解决
  15. ES6学习(模板字符串)
  16. 《C和C++程序员面试秘笈》——1.4 i++与++i哪个效率更高
  17. 网站 smtp服务器,网站smtp服务器
  18. python评分卡模型
  19. bugku之密码ok解题思路
  20. Qt 中信号和槽机制

热门文章

  1. 根据工厂日历自动计算请假时间
  2. 西电_2022春_数据库原理_实验二
  3. Java面试汇总六 SpringCloud面试必问
  4. 【产品经理交互常用软件】axure软件详细教程与学习指南
  5. PPT限时领取 | 2019 GIAC 互联网架构大会蓄势来袭
  6. UE 库文件使用方法
  7. nrf52832 学习笔记(二)SDK框架分析
  8. TL138-EVMLinux内核编译方法
  9. python抓取网页视频
  10. SQL必知必会 - 子查询/组合查询