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

 typedef struct vexnode
{
  int vertex;
  arcnode* firstarc;
}adjlist[Vnum];

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

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

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

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

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

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

我们先看个例子:

 typedef struct student
{
  char name[];
  char sex;
  int age;
  float high;
}STUDENT;
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 代表的就不仅仅代表一个结构体类型了,它被赋予了外加的一个特性:数组;也就是说如果我们这样写

 adjlist a;

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

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

 typedef struct vexnode
{
  int vertex;
  arcnode* firstarc;
}[Vnum] adjlist;

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

小结:

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

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

C语言结构体数组遇上typedef的更多相关文章

  1. C语言 结构体数组保存到二进制文件中

    在项目中我定义了一个结构体数组,头文件如下: C/C++ code   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  2. C语言结构体数组内带字符数组初始化和赋值

    1.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char c ...

  3. c语言结构体数组定义的三种方式

    struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; int dangdang;//成员名可以和类名同名 }ddd[];/ ...

  4. C语言结构体数组

    #include <stdio.h> int main() { /*************************************************** *结构体数组:数组 ...

  5. c语言结构体数组引用

    struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }dbdd[]={{,,}, {,,} };//初始化 void m ...

  6. C语言结构体篇 结构体

    在描述一个物体的属性的时候,单一的变量类型是无法完全描述完全的.所以有了灵活的结构体变量. 结构体变量从意义上来讲是不同数据类型的组合,从内存上来讲是在一个空间内进行不同的大小划分. 1.1 结构体类 ...

  7. C语言 结构体(嵌套结构体--结构体数组)

    //结构体--嵌套结构体和结构体数组 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> ...

  8. 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

    原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...

  9. C语言-1.结构体,2.枚举,3.typedef,4.预处理指令的概念,5.条件编译

    1. 结构体数组 定义:由若干个相同类型的结构体变量组成的有序的集合. 定义格式: 1) 定义结构体的同时定义结构体数组 struct Car{ int lunzi; int speed; }cars ...

随机推荐

  1. 10.HanLP实现k均值--文本聚类

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 10. 文本聚类 正所谓物以类聚,人以群分.人们在获取数据时需要整理,将相似的数据 ...

  2. DC-8靶机渗透实战

    前言: 本文将讲述通过信息收集,再web站点的sql注入漏洞加john爆破登录后台,然后找到远程代码执行漏洞getshell,最后用exim4命令提权漏洞进行权限提升拿到最终的flag. 0x00 环 ...

  3. 使用pip安装Python库超时解决办法

    如果在国内安装Python库,强烈推荐使用豆瓣的源http://pypi.douban.com/simple/ 可以这样使用 pip install -i http://pypi.douban.com ...

  4. WebGL_0004:带贴图的材质透明效果

    在材质中: "blendType": 2,

  5. VMware桥接模式下虚拟机ping主机不通

    现象: VMware设置为桥接模式,虚拟机ping主机不通,主机ping虚拟机通. 解决: 尝试以下几种方法 关闭主机(专用网络.来宾或公用网络)和虚拟机的防火墙. 更改桥接的物理网卡,确保是主机正在 ...

  6. cin,cin.get(),cin.getline(),gets(),getchar()函数的用法

    1.cin>> 用法a:最基本的流输入用法,接受一个数字或字符,自动跳过输入的空格. 用法b:接受一个字符串,但是遇到除开头外的空格则会终止输入. #include<iostream ...

  7. web服务器的解析漏洞罗列

    前言 服务器相关中间件存在一些解析漏洞,攻击者可通过上传一定格式的文件,被服务器的中间件进行了解析,这样就对系统造成一定危害.常见的服务器解析漏洞涉及的中间件有IIS,apache.nginx等.可利 ...

  8. Linux一些基本命令、inode定义、软硬链接

    1.创建普通文件命令:touch 命令 2.创建目录文件命令:mkdir 命令 3.删除普通文件命令:rm 命令 4.删除目录文件命令:rmdir 命令 5.给普通文件写东西命令:vim 命令 6.查 ...

  9. ubuntu 16.04.1上安装并使用vsftpd

    1.安装vsftpd软件 sudo apt-get install vsftpd 2.新建文件 sudo vim /etc/vsftpd.user_list 用于记录用户名 3. 修改sudo vim ...

  10. 牛客网——剑指offer(跳台阶以及变态跳台阶_java实现)

    首先说一个剪枝的概念: 剪枝出现在递归和类递归程序里,因为递归操作用图来表示就是一棵树,树有很多分叉,如果不作处理,就有很多重复分叉,会降低效率,如果能把这些分叉先行记录下来,就可以大大提升效率——这 ...