结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。

一、结构体的形态

C源程序(struct.c):

#include

typedef struct{

unsigned short int a;

unsigned short int b;

}Data;

int main()

{

Data c, d;

c.a = 1;

c.b = 2;

d = c;

printf("d.a:%d\nd.b:%d\n", d.a, d.b);

return 0;

}

赋值部分翻译后:

movw $1, 28(%esp) # c.a = 1

movw $2, 30(%esp) # c.b = 2

movl 28(%esp), %eax #

movl %eax, 24(%esp) # d = c

可以看出:

c.a 是在 28(%esp) 之后的2个字节

c.b 是在 30(%esp) 之后的2个字节

c 是 28(%esp) 之后的4个字节

d 是 24(%esp) 之后的4个字节

不得不感叹名字(结构体名字、子元素名字)再一次被抛弃了,子元素名代表的是相对于结构体的偏移。

二、结构体的复制

大一的时候,老师千叮咛万嘱咐:数组不能复制!但是当发现下面这个程序正常运行后,我困惑了(block.c):

#include

typedef struct{

char data[1000];

}Block;

Block a={{'a','b','c',}};

int main()

{

Block b;

b=a;

puts(b.data);

return 0;

}

Block a={{'a','b','c',}} 是对 a 的部分初始化,'c' 后面自动填 0,写成 Block a={{"abc"}} 也一样,C 语言对初始化还是很宽容的。

上面这个程序居然正常的编译、运行了,这究竟是怎样的逆天?

看看汇编部分:

leal 24(%esp), %edx

movl $a, %ebx

movl $250, %eax

movl %edx, %edi # edi = &b

movl %ebx, %esi # esi = &a

movl %eax, %ecx # ecx = 250

rep movsl

我们发现程序确实通过 250 次 movsl 复制了一个"数组"。其原因是:结构体是可以复制的,结构体又可以包括任意类型的子元素,数组也行,所以"数组"也被复制了。

那为什么纯粹的数组就不能复制呢?

我们可以这样去理解:一个变量能被复制的必要条件是我们知道它的大小。结构体做为自定义类型,在编译的时候编译器必然存储了它的子元素类型、个数等相关信息,结构体的大小也就知道了;而数组一般只在乎它的类型和起始地址,元素个数总是被忽视的(例如:void func(char s[]) 可接受任何长度的字符数组做参数),而且元素个数也没有被当做数组的一部分存入内存,所以数组的复制是不好实现的。

小结

如果给结构体下一个实在点的定义话,那就是:有格式的字节数组。有了结构体后 C 语言的变量类型就丰富多了,但是同时也要注意:

超过 4 字节的结构体不宜做参数(参数传递浪费时间、空间),换做指针更好。

超过 4 字节的结构体不宜做返回值类型(话说一般返回值都用 eax 来存,那么超过 4 字节的时候怎么存呢?自己去探索吧!)。

出差必备

买火车票、高铁票、机票,订酒店都打9折的出行工具TRIP,点击注册

c语言输出狐狸图形,c语言中的结构体相关推荐

  1. 【C 语言】文件操作 ( 读取文件中的结构体数组 | feof 函数使用注意事项 )

    文章目录 一.读取文件中的结构体数组 | feof 函数使用注意事项 二.代码示例 一.读取文件中的结构体数组 | feof 函数使用注意事项 读取文件结构体时 , 可以循环读取文件中的数据 , 只使 ...

  2. 【C 语言】文件操作 ( 学生管理系统 | 命令行接收数据填充结构体 | 结构体写出到文件中 | 查询文件中的结构体数据 )

    文章目录 一.学生管理系统 二.代码示例 一.学生管理系统 前两篇博客 [C 语言]文件操作 ( 将结构体写出到文件中并读取结构体数据 | 将结构体数组写出到文件中并读取结构体数组数据 ) [C 语言 ...

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

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

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

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

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

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

  6. c语言输出成绩表格制作教程,c语言输出表格用C语言怎么样输出表格

    c语言输出表格用C语言怎么样输出表格 答案:1  信息版本:手机版 解决时间 2019-10-06 04:28 已解决 2019-10-05 10:38 c语言输出表格用C语言怎么样输出表格 最佳答案 ...

  7. C++中的结构体,C管理进程代码,C++管理进程代码,C语言中的联合体

     1.C++中的结构体 #include<iostream> struct lstruct { int num; }; struct MyStruct { int num; doubl ...

  8. C++工作笔记-结构体与类的进一步探究(在C++中的结构体,非C语言结构体)

    今天把Qt Creator中的项目放到VS上,使用MSVC编译器发现跑不动链接错误,报的是如下的这个错误: 我在Qt上用MinGW明明不会报错,而他却说链接不到,日了个狗. 后面根据报错提示,我把如下 ...

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

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

最新文章

  1. 程序员:做测试开发每天忙于业务,看不到希望
  2. 说说牛顿迭代 -- 方法篇
  3. 质量体系审核中的10大常见场景,你遇到了几个?
  4. python编程(深拷贝和浅拷贝)
  5. 计算机科学与工程国际研讨会,2018年北京计算机科学与技术国际研讨会
  6. Qt QComboBox 下拉框样式修改
  7. 自己做一个小项目python_【Python】第一个微信小项目
  8. 嵌入式开发板硬件操作入门学习3——电机驱动板
  9. 中画幅相机焦距水平视角_摄影中的“中画幅”是什么?
  10. 月入万元的自由程序员 (转电脑报)
  11. IEEEAccess参考文献整理
  12. swift转场动画_Swift游乐场的演变
  13. 【IPv6】IPv6有无状态地址分配及IPv6路由
  14. 以太网交换机的用途有哪些?
  15. 下了个蓝屏代码查看工具,就中病毒了。。。什么鬼病毒,竟然还是用的VBS
  16. 美团招聘视觉算法实习生
  17. Java,微信交流群
  18. Windows10安装Mac OS系统
  19. 民事诉讼法知识点详细版
  20. 【毕业设计】基于单片机的GPS定位位置记录系统 - 物联网 嵌入式 stm32

热门文章

  1. ajaxpro使用方法以及发布到服务器出现的问题修改方法
  2. php递归执行,php递归算运行流程解析法实例演示
  3. 顶级架构师应该知道的99件事
  4. 升级ie11浏览器 报错0x80240037 解决方案
  5. su oracle 和 su - oracle的区别
  6. OpenCV 图像边缘提取(三)—— Laplance算子提取边缘原理及OpenCV API使用(C#)
  7. Telegram中语音
  8. HandShaker 连接使用教程 Mac版
  9. 我的“信条”——富尔格姆的短文《信条》读后感 (2018-05-06 22:11:04)
  10. 六级备考28天|CET-6|听力第一讲|基本做题步骤与方法|13:30~14:30