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

// 这个讲的特别详细,主要是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. linux内核优化策略,linux系统调优小结
  2. Codeforces Gym101518H:No Smoking, Please(最小割)
  3. python3多线程自定义threading子类
  4. 官宣!苹果3月25日发布会邀请函派出:服务为主硬件为辅
  5. 普通人如何月入10万
  6. 基于知识图谱和图卷积神经网络的应用和开发
  7. .NET:OrderBy和ThenBy
  8. 自己写的一个Js小插件
  9. java创建容器对象的类是什么_spring容器创建bean对象的方式
  10. IDEA高级使用教程
  11. 用计算机画对称图形,人教小学美术五下《第17课电脑美术 对称图形》word教案...
  12. 做一个迷你播放器放在桌面
  13. 【转】HTML5斯诺克桌球俱乐部【译】
  14. R手册(Common)--R语言入门
  15. CCF ChinaSoft 2022 大会特邀报告重磅推出!
  16. 黑夜给了我黑色眼睛,我却用它来寻找创维
  17. TempDB 收缩方法
  18. 《新闻写作(汉语言)》
  19. 谈谈海外移动支付普及的一点障碍
  20. Primavera P6 EPPM R17.12.X Patch/Update(补丁/更新)

热门文章

  1. 纯css写出来的小彩虹
  2. L1-028 判断素数 (10分) 笔记
  3. bagging和boosting算法(集成学习算法)
  4. Android版本的 Wannacry 文件加密病毒样本分析 附带锁机
  5. vue 3.0 slot 使用方法
  6. 疯狂Java讲义-面向对象(上)
  7. Windows 更新永恒之蓝 补丁包方法
  8. Ubuntu使用有线网卡连接开发板,同时使用无线网卡上网
  9. 【程序猿历程】小时候的味道,水浒卡
  10. 关于磁盘分区管理工具