最近在使用结构体时,碰到了各种各样的用法,搞得我很乱,因此就好好查了下资料,又看了看书上是怎么写的,然后在这里做个总结,记录一下。
  参考网址如下:

// 这个讲的特别详细,主要是C++的用法,也提到了与C的不同。
https://www.cnblogs.com/wanshuai/p/9088683.html#top//这个列举的例子比较多,参考起来很棒。
https://blog.csdn.net/fly_time2012/article/details/80867852

1 结构声明

  结构声明描述了一个结构的组织布局。举例如下:

struct tempA
{char  cvariableA;  // char  类型的变量 cvariableAint   ivariableB;  // int   类型的变量 ivariableBfloat fvariableC;  // float 类型的变量 fvariableCchar  carrayA;     // char  类型的数组 carrayA
};

  下边依次对此结构进行解析:

  • struct
    struct是一个关键字,表明跟在其后的是一个结构;
  • tempA
    tempA是一个可选的标记,但是在上述例子中,不能去掉,否则该结构没有作用的“对象”,不过可写成如下样式:
struct
{char  cvariableA;  // char  类型的变量 cvariableAint   ivariableB;  // int   类型的变量 ivariableBfloat fvariableC;  // float 类型的变量 fvariableCchar  carrayA;     // char  类型的数组 carrayA
}tempB;

  tempA这个标记,写与不写,主要有以下区别:

  1. 写了此标记,则可以在后续程序中使用此标记来引用该结构;
struct tempA book;   // C 写法// C++允许在声明结构变量时,省略关键字struct
tempA book;         // C++ 写法
  1. 如果不写此标记,则只引用该结构定义了一个变量,也就是一次性的,如果需要定义另外一个拥有相同元素的结构体变量,必须要全部重新再写一遍,不能直接引用tempB。

2 定义结构变量

  结构有两层含义,一层是“结构布局”,就是上边的结构声明。结构布局告诉编译器如何表示数据,但是它并未让编译器为数据分配空间(待确认,看参考的经验,利用sizeof还是有空间的)。
  下一步是创建一个结构变量, 即是结构的另外一层含义,前边也有提到过,程序中实现如下:

struct tempA book;   // C 写法
tempA book;         // C++ 写法

  但是如果打算多次使用此结构,就要使用带标记的形式,也就是必须要写tempA;或使用typedef,下边将讲一下typedef的用法。

3 typedef定义结构体

  个人建议使用 typedef 时,把标记也写上,这样在C中,可以使用typedef定义的类型(tempB),在C++中可以直接使用标记(tempA)。两个名字应该是不能一样的。

typedef struct tempA
{char  cvariableA;  // char  类型的变量 cvariableAint   ivariableB;  // int   类型的变量 ivariableBfloat fvariableC;  // float 类型的变量 fvariableCchar  carrayA;     // char  类型的数组 carrayA
}tempB;

  使用 typedef 的好处有如下两点:

  1. 为经常出现的类型创建一个方便,易识别的类型名。
  2. typedef 常用于给复杂的类型命名。

4 常见的定义结构体方法举例

1 未用typedef

  • 先声明结构体类型,再定义结构变量
struct tempA
{char  cvariableA;  // char  类型的变量 cvariableAint   ivariableB;  // int   类型的变量 ivariableBfloat fvariableC;  // float 类型的变量 fvariableCchar  carrayA;     // char  类型的数组 carrayA
};struct tempA book;    // C 写法
tempA book;         // C++ 写法
  • 在声明的类型的同时,定义结构变量
struct tempA
{char  cvariableA;  // char  类型的变量 cvariableAint   ivariableB;  // int   类型的变量 ivariableBfloat fvariableC;  // float 类型的变量 fvariableCchar  carrayA;     // char  类型的数组 carrayA
}book;
  • 直接定义结构体类型变量(没有标记)
struct
{char  cvariableA;  // char  类型的变量 cvariableAint   ivariableB;  // int   类型的变量 ivariableBfloat fvariableC;  // float 类型的变量 fvariableCchar  carrayA;     // char  类型的数组 carrayA
}book;

2 使用typedef

  • 直接定义结构体变量,没有标记,但是可以使用此变量引用该结构体
typedef struct
{char  cvariableA;  // char  类型的变量 cvariableAint   ivariableB;  // int   类型的变量 ivariableBfloat fvariableC;  // float 类型的变量 fvariableCchar  carrayA;     // char  类型的数组 carrayA
}tempB;tempB book;  // C C++ 均可
  • 推荐使用的方法,即定义标记,有定义结构体变量
typedef struct tempA
{char  cvariableA;  // char  类型的变量 cvariableAint   ivariableB;  // int   类型的变量 ivariableBfloat fvariableC;  // float 类型的变量 fvariableCchar  carrayA;     // char  类型的数组 carrayA
}tempB;

  此时如果使用C,则可以使用tempB;如果使用C++,则可以使用tempA或tempB。

5 总结

  除了上边讲的,还有其他一些结构体初始化,结构体里边定义结构体等等,都可以参考文章开头的网址,里边讲的比较详细。这里只对我目前用到的做一个总结
  写此篇博客,就是我的一些想法和理解,以后我也会按照文中推荐的标准来使用(用typedef,标记和结构变量都要),这样兼容性比较好,也使自己的代码有一定风格,也比较统一。

C/C++ 结构体定义及使用相关推荐

  1. Go 学习笔记(14)— 结构体定义、实例化、初始化、匿名结构体、结构体访问、结构体作为形参、结构体指针

    Go 语言中没有 "类" 的概念,也不支持 "类" 的继承等面向对象的概念.Go 语言不仅认为结构体能拥有方法,且每种自定义类型也可以拥有自己的方法. 1. 结 ...

  2. c++结构体定义和使用_[day day go]结构体amp;给结构定义方法

    结构体 //定义 type treeNode struct {value intleft, right *treeNode }//工厂函数创建 func createNode(value int) * ...

  3. C#中结构体定义并转换字节数组

    ref: https://www.cnblogs.com/dafanjoy/p/7818126.html C#中结构体定义并转换字节数组 最近的项目在做socket通信报文解析的时候,用到了结构体与字 ...

  4. 结构体定义小的放前面_编程C语言进阶篇——自定义数据类型:结构体

    一.结构体 定义方法: 结构名 变量名 特点: 两个同类型的结构变量可以相互赋值,但是结构变量之间不能使用"<","=="等运算符,如果使用则需要对运算符 ...

  5. C/C++中struct结构体定义变量的3种方法及初始化

    本博客整理自http://blog.csdn.net/zunfo/article/details/51494631 1.struct结构体定义 1.1.先定义结构体,然后再定义结构体变量 struct ...

  6. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  7. C++ 线性表的结构体定义(顺序表和链式表)

    线性表的结构体定义: 1.顺序表的结构体定义 typedef struct {int data[maxSize];int length;} Sqlist; 2.单链表结点的结构体定义 typedef ...

  8. Linux下查找结构体定义的位置

    1.首先我们要进入目录: 比如:cd /usr/include 2.查找在当前目录下的结构体: 指令:grep "struct sockaddr_in {" * -nir 形式:g ...

  9. C语言结构体学生基本资料,用结构体定义10个学生基本信息

    用结构体定义10个学生基本信息,用到结构体.子函数.文件等的相关知识. /* ************************************************* 2.1.用结构体定义1 ...

  10. RadarApp结构体定义

    消息结构体定义及说明 数据类型 一.帧类型定义 1.1 控制帧 1.1.1 控制帧帧头定义 1.1.2 控制帧类型(ucDataType) 1.2 数据帧类型 1.2.1 数据帧帧头定义 1.2.2 ...

最新文章

  1. 转载:谢谢原作者:块设备驱动实战基础篇四 (逐渐成型,加入ioctl通信机制)
  2. svmtrain和svmpredict简介(转)
  3. 计算机中减法的实现原理
  4. python 工资管理软件_4_python之路之模拟工资管理系统
  5. springboot jar包运行中获取资源文件
  6. java的左移位()和右移位()和无符号右移()
  7. Swing 100行画图示例
  8. spring boot默认扫描的路径
  9. AutoCAD2012从入门到精通中文视频教程 第28课 文字和表格命令(1)(个人收藏)
  10. 一款快速开单 订单发货收货的在线订货管理软件
  11. Mac 常用的 20 款效率神器推荐
  12. 通知的各种实用写法技巧
  13. 百度地图android版v6.7,百度CarLife
  14. 花18块买了腾讯的幻核 NFT,里面到底有什么?
  15. Linux-重命名命令rename
  16. 工程提示Unfortunately you can‘t have non-Gradle Java modules and > Android-Gradle modules in one project
  17. 备忘录模式 - Unity
  18. 性能测试篇-通过shell脚本优化iozone测试硬盘读写性能
  19. c语言cad实验报告,1.电子线路CAD实验报告实验
  20. Leetcode日常刷码(5)解决最大利润问题(Java)

热门文章

  1. 一本通 1407:笨小猴
  2. 高速低温离心机参数及操作规程
  3. HTML期末大作业~基于HTML+CSS+JavaScript 牛排美食餐饮网站设计与实现(6个页面)
  4. 都仿佛向人们宣告秋天到来了
  5. vs2017的使用以及断点调试
  6. 快速打爆新品:前两周高权重操作技巧
  7. python 程序化交易信号闪烁_程序化交易模型的信号闪烁问题及解决办法
  8. 防水透气织物的若干探讨
  9. 【汽车销量】2020全年乘用车企业销量排名:大众、通用、吉利、长安前10——爱普搜汽车
  10. 了解唐伯虎和他的桃花庵