引用 C 语言结构体学习

这篇文章很基础,是个学习的好资料,所以收藏了:

1.直接声明结构体变量:

struct{

int length;

int width;

}box1;

这样就声明了一个名为box1的结构体变量,但是同时要注意,如果在同一个程序中还存在如下的声明:

struct{

int length;

int width;

}box2;

请千万不要认为这个时候box1和box2是两个相同类型的变量,如果你尝试将box1赋值给box2,你将会发现编译器会给你一个错误提示:incompatible types in assignment ,说明两个两个变量的类型是不同的

2.采用标签式的声明方式

struct BOX {

int length;

int width;

};

这样就可以使用这个标签BOX来声明一系列同类型的变量,请记住使用下面的声明方式,而不是简单的

BOX box1这样,当然这样也是可以的,不过需要换另外一种标签方式,声明方式如下:

struct BOX box1;

struct BOX box2;

这个时候两个变量的类型就是一样的了!当然你也可以在采用这种标签式的声明时,同时声明一个变量,如下面的一样:

struct BOX {

int length;

int width;

}box;

这个时候既采用了标签式声明又声明了一个变量box

3.利用typedef关键词产生新类型

这个时候就可以用产生的新类型来声明一个变量了,而不是简单的一个标签,这样书写代码会更清晰,也更易懂,同时也易维护

typedef struct {

int length;

int width;

}BOX; 注意:这个时候的类型名要写在最后 不要写在上面,开始的时候只是typedef struct,如果在这上面再加上一个东西,那是有其他作用的,类似这样:typedef struct box

现在如果要声明一个变量就可以用BOX box1,BOX box2来声明了!看上去简单了不少!

至此已经介绍了3种不同的声明结构体的方法,可以看到c语言在语法方面还是很松散的,可以根据个人的喜好来选择不同的声明方式,但是还有一个两个问题没有解决,如果学过数据结构的话,你会发现很多的数据类型,比如树,链表,图,里面的很多地方使用了结构体,并且在结构体里面引用自身,这就是今天要特别说明的地方

4.结构体的自引用?

如果要在一个结构体里面申明一个与本身一致的结构体类型,该怎么办呢?可能会这么写代码:

struct BOX {

int length;

int width;

struct BOX box1;

};

看上去很正确,在结构体中再声明一个与自己一样类型的结构体,但是这已经陷入了一个死循环,A包含B,B又包含A,没有休止!忽视了编译器的执行顺序,在一个结构体的声明没有结束之前,编译器并不知道该结构体的长度,所以编译器在编译的时候就不知道这个box1究竟是有多大了!会报一个错:

field `box1' has incomplete type

但是我们可以想一想,这里可以包含一个包含自身的指针,因为所有指针的长度是固定的,在编译之前就已经知道了,所以编译器在编译时会顺利通过,这也是大多数数据结构比如树,链接采用的一个技巧

struct BOX {

int length;

int width;

struct BOX *box1;

};

改为上面的声明样式就可以了,其中的box1现在成了一个指向自身的指针!编译会顺利通过!

最后我们还来思考一个问题,如果有下面的一个声明,你猜会有什么结果呢?

typedef struct {

int length;

int width;

BOX *box1;

}BOX;

原本是通过typedef来定义了一个新的结构体类型BOX,然后在结构体内部,使用这个新类型来定义一个指向本身的指针,但是这个时候编译器给出了一个error:syntax error before "BOX"

这是为什么呢?

因为类型名在声明的结尾才算完成定义,所以在结构内部使用的话是没有定义的,变通的方式是这样:

typedef struct box {

int length;

int width;

struct box *box1;

}BOX;

最后这个声明,将前面所说的几种不同方式的声明都结合起来了

C 语言结构体引用,引用 C 语言结构体学习相关推荐

  1. c语言中结构体数组的引用,【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  2. c语言的结构体指针的引用,C语言中的指针、引用、数组、结构体

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里"引用"表示计算机内存地址.从指针指向的内存读取数据称作指针的取值 ...

  3. c语言结构引用6,C语言6结构体练习题6

    第六章 结构体 1.下面对结构变量的叙述中错误的是 A.相同类型的结构变量间可以相互赋值 B.通过结构变量,可以任意引用它的成员 C.结构变量中某个成员与这个成员类型相同 的简单变量间可相互赋值 D. ...

  4. c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt

    <<结构体与共同体>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<结构体与共同体>PPT课件.ppt(44页珍藏版)>请在装配图网上搜索. 1 ...

  5. c语言常量结构体的成员,c语言之结构体

    c语言之结构体 1.结构体基础知识 C语言提供了两种类型的聚合数据类型(能够同时存储超过一个的单独数据),数组和结构.数则是相同类型的元素的集合,而结构也是一些值的集合,这些值称为它的成员,单一个结构 ...

  6. 取消对 null 指针“l”的引用。_C语言编程笔记丨C 语言指针 5 分钟教程

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里"引用"表示计算机内存地址.从指针指向的内存读取数据称作指针的取值 ...

  7. python中的记录指针_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...

  8. python结构体数组传出接收c动态库_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...

  9. 结构体复数相乘c语言,复数乘法中的结构体赋值实现代码

    复数乘法中的结构体赋值实现代码 废话不多说,直接上代码 复制代码 代码如下: #include using namespace std; typedef struct { double real; d ...

最新文章

  1. BZOJ3930: [CQOI2015]选数
  2. mysql-5.7.14-win32.zip 解压版 安装过程
  3. literature review and methodology
  4. angularjs 同步請求_angularjs $q、$http 处理多个异步请求
  5. python三大神器装饰器_Python2.x
  6. LeetCode 538. 把二叉搜索树转换为累加树
  7. Unity3D中JavaScript与C#对比
  8. 微软“黑历史”:一个活了 45 年的愚蠢 Bug!
  9. python print return不同_Python中return和print的作用及区别
  10. 大学jsp实验3include指令的使用
  11. PHP 实例 AJAX 与 MySQL
  12. 设计模式 (十八 ) 观察者模式
  13. WLC5520无法通过无线客户端进行网管故障解决
  14. Win系统 - 如何清除冰点还原精灵 Deep Freeze 密码?
  15. BootStrap快速入门
  16. 常用Dos命令以及英文全称(有道解读)
  17. TestFlight APP测试(IOS如何让上架前给其他人测试)
  18. 父盒子内子盒子居中的方法
  19. ChatGPT国内镜像站
  20. java –cp ./:_7位专家– 7条意见:您如何看待新的Java发布周期?

热门文章

  1. 【TI-ONE系列教程(五)】如何使用 TI-ONE SDK 玩转算法大赛
  2. data2vec!统一模态的新里程碑
  3. 插件怎么用_【Anki插件篇】(01)插件介绍
  4. Tiktok引流到独立站?
  5. iphone通知和android,手机App 通知数量太多,让你备感压力吗?教你如何消除令人心烦的信息通知(iPhone、Android)...
  6. 联想台式主机拆机教程_联想发布全新刃9000台式主机:搭载英伟达最新显卡+8999元...
  7. exls导入数据库 php_建站程序推荐:开源免费的PHP在线模拟考试系统PHPEMS可商用...
  8. QT+OpenGL中glTexImage2D不生效问题
  9. SSH应用之BBS之路-2、Hibernate配置
  10. 若依后端实现pdfjs预览PDF文件