目录

  • 前言
  • 结构体和数组的区别
  • 结构体的声明
    • 方式一(不带 tag)
    • 方式二(带 tag)
  • 关于 typedef
    • typedef 在结构体的使用
  • 结构成员的访问

前言

结构体是在数据结构中经常使用的一类,下面对结构体进行一些知识的补充。

结构体和数组的区别

结构体的声明

结构体声明的基本形式

struct tag {member-list
}variable-list;

参数解释

  1. tag:结构体的名字
  2. member-list:成员列表
  3. variable-list:变量列表

在结构体声明的时候,我们常会看到下面两种声明的方式

方式一(不带 tag)

struct {int age;char sex;
}man;

大多数初学者看到这一长串的时候会发昏,这样的声明形式和一般的 int a 的形式有什么关联呢?

方式二(带 tag)

struct people{int age;char sex;
};struct people man1 , man2;

我们可以看到方式二的好处就是减少了变量声明的冗余。如果像方式一那样,你在另一个地方要声明一个相同的变量,就必须把前面的成员列表那一大部分也带上。

struct peple 作为整体相当于数据类型的名字,也就是说 struct peopleintfloat 是同一级别的概念。

同时使用方法一还会存在下面这个问题

struct {int age;char sex;
}man1;struct{int age;char sex;
}man2;man1 = man2;  // 报错

虽然 man1 和 man2 是一样的结构体类型,但是编译器会认为是不同的类型。

但如果用方式二就不会报错

struct people{int age;char sex;
};struct people man1 , man2; // 或者为了好理解,也可以是 // struct people xiaozhang , xiaoli;
struct people man3;man1 = man3; // 这样就正确

关于 typedef

typedef 也是在数据结构中常用的 C 语言的东西。它的英文翻译是 “类型定义”。下面就来看看它的用法。

我更喜欢叫 typedef 为语义化,因为很大程度上使用 typedef 是为了语义化,是需要结合现实世界的。

  typedef int Money

这句代码的意思就是,从今往后,Money 就可以代表 int 使用了。

Money money ; // 此时 money 就是 int 类型,等价于 int money;

至于为什么使用 typedef 这样的方式,个人最大的感受就是语义化吧,当然 typedef 为什么要使用的其他原因可以自行谷歌。

typedef 在结构体的使用

先来看看这段代码

typedef struct people {int age;char sex;
} chinese;

很多人会和结构体的声明弄混,其实不是,我用图例来解释就清楚了(对比结构体声明的图例,观察二者的区别)


其中,people 表示的是结构体的名字,正如前面所说,struct peopleintbool 这些是同一级别的概念。

当然,用 typedef 的时候,你也可以省略结构的标签,所以你有时还会看到下面的写法

typedef struct {int age;char sex;
} chinese;

下面来看看数据结构单链表里面比较难理解的对单链表如何去定义

typedef struct Node_1
{int data;struct Node_1 *next;
}Node_2;typedef struct Node_1 *linkList;// 通常代码会把 Node_1 和 Node_2 都写成一样的 Node,具体的原因我也不是很清楚,
// 有知道的同学可以在下面留言
// 但是仅就代码而言 Node_1 表示的是结构体的名称,而 Node_2 表示的是代替简写
// struct Node_1 的名称。// 特别的是 struct Node_1 定义的是一个单独的结点,所以我们看到 struct Node_1
// *next; 其本意是只该结点的下一个结点
// 而 typedef struct Node_1 *linkList; 表示的是一个结构体指针,有了指针,我们就
// 可以通过 malloc 函数将一个单独的结点扩充成一个链表了。// 所以我们在定义 *linkList 的时候,typedef Node_2 *linkList; 和
// typedef struct Node_1 *linkList; 都是正确的。

结构成员的访问

主代码

struct people{int age;char sex;
};struct people man1 , man2,man3,*man4;


一个访问 typedef 定义的结构体的示例

// c++ 版本
#include <iostream>
using namespace std;int main()
{typedef struct{int age;string name;}people, *ppeople;// 点操作符people zhangsan = {13, "zhangsan"};cout << zhangsan.age << endl; // 13cout << zhangsan.name << endl; // zhangsan// 箭头操作符ppeople lisi = &zhangsan;lisi->age = 17;lisi->name = "lisi";cout << lisi->age << endl;cout << lisi->name << endl;return 0;
}

图解

C 语言中的结构体(数据结构)相关推荐

  1. Linux结构体变量报错,C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  2. c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)

    前言 C语言中的结构体作为一大难点,并且对于需要学习数据结构的同学来说,这个结构是每次上课都会遇到的,所以,我们只有更深层次的理解结构体的知识,才能更好的掌握数据结构 结构体用处 结构体到底有什么用? ...

  3. C语言中的结构体,结构体中数组初始化与赋值

    最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...

  4. C语言中对结构体排序

    在C语言中对结构体排序 用qsort()函数进行排序, qsort()里面要传入4个参数–qsort(数组名,数组长度,sizeof(),排序方法) 实验9-5 查找书籍 (20分) 给定n本书的名称 ...

  5. C语言中的结构体定义和使用例子

    C语言中的结构体定义和使用例子 一.结构体定义的三种方式 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共 ...

  6. 关于C语言中的结构体所占的字节数 sizeof(struct)

    C语言中的结构体所占的字节数 ,用sizeof求一个结构体的大小 C语言中用sizeof求结构体所占字节数的详细方法. 一.非嵌套结构体 struct one{char a; // 1(char所占字 ...

  7. c语言中的结构体定义和常见用法

    1.结构体简述和概念 结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型.结构体通常用来表示类型不同但是又相关的若干数据 ...

  8. C语言中如何计算结构体的字节大小

    结构体内存对齐 在计算结构体所占字节的大小时,不要直观地累加结构体内成员的字节大小,实际结构体存放在内存中是有一定的规则的,这里涉及的规则就是内存对齐原则. 声明一个结构体stu struct stu ...

  9. step2 . day5 C语言中的结构体和枚举

    最近几天交叉的学习C和Linux,知识梳理的不是很仔细,有很多还没有搞明白的问题,所有耽误了几天更新笔记,也是在细嚼慢咽中,做了一个规划表,现阶段先把C后面的知识学好,然后再梳理Linux系统相关知识 ...

  10. C语言中的结构体怎么使用?

    文章目录 前言 一.结构体是什么? 二.结构体怎么定义? 三.结构体变量怎么初始化? 四.结构体变量怎么访问? 五.结构体怎么使用? 总结 前言 结构体在C语言和C++语言中都是重要的概念,它们广泛应 ...

最新文章

  1. 复旦张奇:如何解决NLP中的鲁棒性问题?
  2. Android UI学习 - Linear Layout, RelativeLayout
  3. 与年轻人的“要疯”五年,安踏如何保持新鲜感与吸引力?
  4. 计算机网络讨论4,计算机网络的创新研究讨论原稿(资料4)
  5. Flash播放控件属性详解
  6. Spring MVC中返回JSON数据的几种方式
  7. 【更新】Navicat Monitor v1.7的新功能说明
  8. python实用宝典_python 5个实用的技巧
  9. C程序-将华氏温度转换为摄氏和开氏
  10. 最短哈密尔顿圈matlab解法_数学建模学习笔记
  11. NLP自然语言处理学习笔记(三)(转自咕泡AI)
  12. 三维重建KInectFusion 学习笔记
  13. 判断手机是否处于静音、震动、正常模式
  14. uniCloud学习笔记---uniId
  15. 网易我的世界服务器怎么显示键盘,电脑版按键操作指南 我的世界电脑版怎么玩...
  16. 利用python在网上接单赚钱,兼职也能月入过万,赶紧学起来!
  17. 电脑派位系统(新生入学摇号) v2016
  18. 【Linux】vim全选,全部复制,全部删除
  19. python——温度换算(以字母结尾)
  20. 读书笔记之计算机体系结构

热门文章

  1. html为知笔记模板,新建笔记模板二次开发
  2. 现代信号处理——阵列信号处理(阵列信号的高分辨处理)
  3. zbbz插件使用教程_CAD坐标自动标注zbbz插件非常实用(附压缩包及安装步骤)
  4. Python爬取当当网图书数据
  5. Ubuntu录屏及gif制作
  6. JAVA 连接sftp服务器,用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)
  7. 最新版WinRAR 6.0 永久去除广告
  8. iweboffice文档内容服务器文件,iWebOffice2015使用常见问题-NTKOOffice文档控件.doc
  9. ZipArchive实现中文压缩
  10. unity序列帧动画的粒子特效