zoukankan      html  css  js  c++  java
  • C语言结构体数组遇上typedef

    昨天韩同学在做数据结构题的时候,问了我一个关于typedef 与结构体数组的问题:

    1 typedef struct vexnode
    2 {
    3   int vertex;
    4   arcnode* firstarc;
    5 }adjlist[Vnum];

    这里我们先回顾一下struct是怎么使用的。

    1.有名构造类型-结构体

    1 struct student //<-------结构名
    2 {
    3   char name[30]; //<-------结构成员
    4   char sex;
    5   int age;
    6   float high;
    7 }stu;      //<--------定义数据类型同时定义stu结构体变量(不要忘记;号,在C语言中,凡是构造类型都要加分号,比如union8 struct student stu2; //<-------这时候我们还可以用struct student结构体类型定义另一个 stu2结构体成员变量(此处的struct不可省,在C++中才可以省略)

    2.别名构造类型-结构体

    上面我们使用有名构造类型-结构体可以满足要求了,为何还要有个别名构造类型呢?

    因为你看上面的第8行代码,我们定义一个新的结构体类型变量时,每次都要写上长长的前缀struct student 不太方便简洁,而且在大型项目中,变量往往都占用了很长的位置,更显累赘,于是typedef 登场了。

    我们先看个例子:

    1 typedef struct student
    2 {
    3   char name[30];
    4   char sex;
    5   int age;
    6   float high;
    7 }STUDENT;
    8 STUDENT stu, stu2;

    对比上面两例的代码,我们发现是不是只有两点差异:

    1.struct 前添加了typedef

    2.结构体的右下角右括号}后的结构体变量stu替换成了STUDENT

    于是,我们就可以用student结构体类型的别名STUDENT去定义结构体变量啦!就有了第8 行代码,与我们的基本数据类型例如 int a ,是不是一致啦!

    别忙,我们先理清下思路到底是怎么给结构体类型取别名的?我想通过我上面的分析可以归纳出以下两个步骤:

    1.先按照有名构造类型-结构体 的方式定义结构体类型,同时定义一个结构体变量;

    2.在定义好的结构体类型struct 前添加typedef,然后把定义的结构体变量替换成你取定的别名。

    回到最初的问题,韩同学问我的typedef {...}adjlist[Vnum]; 这里我们就可以这样理解啦!

    struct {....}adjlist[Vnum] 了一个结构体类型并且同时声明了一个adjlist[Vnum] 结构体变量,这个变量有点特殊,它是个数组,合起来就是结构体数组,既然名叫结构体数组,那么这个数组中的每个元素的类型不就是 我们定义的结构体类型吗?

    再按照我们上面取别名的步骤,先typedef,然后把结构体变量换成你要取得别名,这里比较特殊的是,我们取得结构体别名就是结构体数组,谨记,那么adjlist 代表的就不仅仅代表一个结构体类型了,它被赋予了外加的一个特性:数组;也就是说如果我们这样写

    1 adjlist a;

    那么上面的代码中 a 就是一个结构体数组了,a中的每个元素都是我们定义的结构体类型。看到这你就差不多会用了,但是不是感觉还是有点未懂?

    哎,其实我给你看下面的代码:

    1 typedef struct vexnode
    2 {
    3   int vertex;
    4   arcnode* firstarc;
    5 }[Vnum] adjlist;

    你看,我把[Vnum]放在了前面 与前面的struct 一个整体 你是不是就明白了,其实原理也是这样的,只是C编译器不认识这种语法,我们把它放在后面了而已,但这种其实才符合人的思维。

    小结:

      1、我们定义的新类型,它的地位等同于int 类型。还只是个模子,如果没有生成
      2、变量的话,是不会占用空间的。
      3、结构定义放置在程序的开始部分,位于头文件声明之后。
      4、注意{}不表示复合语句,其后有分号。
      5、结构体类型名称是struct+结构体名,注意struct 关键字不能省略。

      6、结构体数组的typedef 中我们可以把[] 前置 来帮助我们理解,但实际应用还是正常使用。

  • 相关阅读:
    一步一步实现一个简单的OS(简单的让boot载入setup)
    hdu 1203 I NEED A OFFER!(01背包)
    面向服务与微服务架构
    ThreadLocal,LinkedBlockingQueue,线程池 获取数据库连接2改进
    deeplearning.net 0.1 document
    怎样有效的降低反复的代码
    redmine 自己定义字段mysql表结构
    c语言中使用宏,需要注意的的几点
    gcc自有的define语法,解决变量多次自加的问题
    ubuntu16.04 安装docker
  • 原文地址:https://www.cnblogs.com/lemaden/p/10122929.html
Copyright © 2011-2022 走看看