本文福利在文末!

C语言可谓是编程界的传奇语言,历经几十年,依然排名前列。

本文主要说的是C语言中的结构体,结构体是C语言中重要的一部分内容,也是C语言中常用的一种数据结构。

一、关于结构体在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。

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

结构体的定义如下所示:

struct 

其中:

  • struct为结构体关键字;
  • tag为结构体的标志;
  • member-list为结构体成员列表,其必须列出其所有成员;
  • variable-list为此结构体声明的变量。

在一般情况下:tag、member-list、variable-list这3部分至少要出现2个。

二、结构体常规定义不同的定义,应用在不同场景,所以,我们编程时需要结合实际情况来定义结构体。

方法1:

定义结构体stu,此时结构体相当于一个类型,比如int,如需使用此结构体,方法同int.

struct 

方法2:

定义结构体stu同时定义需要使用的结构体变量stu1, stu2。如后面再需要定义结构体变量,方法同1.

struct 

方法3:

定义结构体时,结构体名称缺省,同时定义结构体变量stu1,stu2。但后面不可再定义结构体变量。

struct

提示:

这里不能像上面再定义结构体变量:(以下错误)

struct 

三、使用typedef定义结构体这里先简单说下typedef.

在C和C++编程语言中,typedef是一个关键字。它用来对一个数据类型取一个别名,目的是为了使源代码更易于阅读和理解。它通常用于简化声明复杂的类型组成的结构 ,但它也常常在各种长度的整数数据类型中看到,例如size_t和time_t。
维基百科

方法4:

使用typedef定义结构体同时,给stu结构体别名STU,后续定义可不用使用struct stu,直接使用STU即可。

typedef 

你会发现,其实就是通过关键字typedef,将STU取代了struct stu。

当然,也可以这么用:

struct 

上面这种定义就失去了typedef的意思,所以不推荐。

方法5:

使用typedef定义结构体时,省掉结构体第一个别名stu,直接在后面加STU,使用方法同上。

typedef 

方法6:

还有一种符合语法规则,但意义不大的定义方式。

typedef 

以上这些定义方式算是语法的知识,如果还不懂,请再次复习一下。

四、结构体大小计算

结构体的大小,我相信很多人都没搞明白。实际编程中也是很多地方都在应用,比如:存储、拷贝结构体时都会牵涉到结构体大小的问题。

1.对比两结构体大小,一样吗?

结构体1:

struct 

结构体2:

struct 

答案是不一样。程序测试得出sizeof(stu1)=6, sizeof(stu2)=4.

2.分析不一样原因

结构体计算要遵循字节对齐原则,一般满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节;

对于上面结构体stu1来说,最大字节:2字节,顺序是 char->short->char:

学习迷茫遇到问题了吗?现在关注微信公众号:C程序编程 免费获取进阶指导和学习资料!

对于上面结构体stu2来说,最大字节:2字节,顺序是 char->char->short:

学习迷茫遇到问题了吗?现在关注微信公众号:C程序编程 免费获取进阶指导和学习资料!

通过上面两个表格,相信你应该明白了,改成4字节的int,原理一样。

最后,强调一下,学习编程,不能只看书,要多敲代码。

如果你正在学习C/C++遇到瓶颈,迷茫,困惑,那么不妨加入一个好的圈子,跟着前辈一起交流学习,永远会比单打独斗强得多!欢迎关注一起交流学习!

c 定义结构体时提示应输入声明_C语言结构体的坑很多,这6大方法千万要记住!...相关推荐

  1. c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...

    我们使用的电子计算机绝大部分都是冯·诺依曼结构的机器,遵循"存储程序"的概念.数据处理以存储为前提,在编程中数据如何"存得进去,取得出来",并且符合空间.时间效 ...

  2. c 定义结构体时提示应输入声明_C|语法的合理性理解和分析

    试想如果你作为C语言或C语言编译器的的设计者,肯定不会任意设置语法规则,除了考虑不能有歧义以外,还会考虑其合理性. 1 效率是第一位的,安全处于次要位置 了解C语言"效率第一.安全次之&qu ...

  3. Win10共享文件时提示需要输入网络凭据怎么办?

    Win10共享文件时提示需要输入网络凭据怎么办?-系统部落 时间:2022-01-17 13:49:26 作者:nana 来源:系统部落 近期有部分Win10用户反映在共享文件时,出现了提示需要输入网 ...

  4. 在安装project2010 64位时提示 “无法安装64位office,因为已有32位版本”解决方法

    在安装project2010 64位时提示 "无法安装64位office,因为已有32位版本"解决方法 参考文章: (1)在安装project2010 64位时提示 "无 ...

  5. cin.ignore在Vs2019中报错提示应输入表示符的解决方案

    在vs2019中使用cin.ignore(std::numeric_limits::max(), '\n'); 编译器提示 max() 应输入标识符 修改成: cin.ignore((std::num ...

  6. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

    来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...

  7. python 结构体指针_C语言结构体指针(指向结构体的指针)详解

    当一个指针变量指向结构体时,我们就称它为C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ char *nam ...

  8. c语言 结构体_颖儿教你学C语言结构体,全面讲解,让程序小白玩转结构体编程...

    C语言结构体详细教学开始 前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号 ...

  9. 文件夹的位置_win10添加网络位置向导 提示:‘输入的文件夹似乎无效。请选择另一个’解决方法...

    添加网络位置向导 提示:输入的文件夹似乎无效.请选择另一个. 出现这个错误的原因:新到手的电脑,用的是最新版的win10,根据Windows官方提示没有默认安装服务器消息块版本1 (SMBv1) 网络 ...

最新文章

  1. poj3370(抽屉原理)
  2. Vue cli3+Hubuilder将项目打包为App
  3. 阿里云-对象存储 OSS > 开发指南 > 基本概念
  4. 网管必读-常用网络命令
  5. VC++软件授权加密与管控(附demo)
  6. 计算机右键菜单太多,鼠标右键菜单选项太多:清理多余菜单选项的方法
  7. 定制QWidget标题栏的示例
  8. 微信支付申请相关问题
  9. A Novel Plug-in Module for Fine-Grained Visual Classification学习
  10. 手机查看python代码_30个极简Python代码,拿走即用
  11. 希尔排序实现与复杂度、稳定性分析
  12. 传奇如何一台服务器配置多个版本微端更新
  13. hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交
  14. CentOS中使用VeraCrypt:安装及创建整个加密硬盘
  15. nagios 的安装
  16. 51单片机wifi物联网的浇花控制系统设计
  17. 如何进行图片局部转TXT文档
  18. 出牌,用程序判断手中的牌是否能够压过对方出牌
  19. STC15W104 8脚单片机串口下载程序
  20. Linux的基本操作(基于Centos7)

热门文章

  1. java模拟退火程序
  2. java语言描述一个行为_设计模式之责任链模式——Java语言描述
  3. python请求post无返回结果_Python请求POST返回不完整的内容
  4. java coding_java coding学习
  5. js 浅拷贝直接赋值_第二十二篇 JS中浅拷贝的方法有哪些?
  6. 【Matlab 图像】图像基础操作
  7. 2.2 逻辑回归-机器学习笔记-斯坦福吴恩达教授
  8. 一起学nRF51xx 3 -  gpiote
  9. java各种包的用途
  10. SpringCloud2.0入门4-springboot-admin监控