目录

一、结构体的设计

二、结构体变量的初始化

2.1结构体在内存表示;

2.2结构体初始化;

2.3结构体指针变量

2.4结构体嵌套结构体

三、结构体成员访问

3.1、结构体成员访问

3.2、结构体变量和指针

​3.3、结构体和函数

四、结构体与数组

五、计算结构体大小

三个规则:

例1、​

例2、

指定对齐值

总结


一、结构体的设计

C语言提供了基本的数据结构,例如 char 、short 、int 、float....等类型;这些偶称为内置类型。怎样设计出来属于自己的类型?

程序员可以使用结构体来封装一些属性,设计出新的类型,在C语言中称为结构体类型。

结构体的定义形式为

struct 结构体名
{成员列表(可以是基本的数据类型,指针,数组或其他结构类型)
};

举个例子来说吧;

客观事务(实体)是复杂的,要描述它必须从多方面进行;也就是用不同的数据类型来描述不同的方面;用学生实体来说:

学生拥有什么? 学号、姓名、性别、年龄;

struct Student
{char s_id[8];char s_name[8];char s_sex[4];int s_age;
};

注意以下几点;

(1)、关键字struct是数据类型说明符,指出下面说的是结构体类型;

(2)、标识符Student是结构体的类型名;

(3)、最后的分号一定要写;

二、结构体变量的初始化

结构体是一种数据类型,也就是说可以用它来定义变量。

结构体就像一个“模板”,定义出来的变量都具有相同的性质。可以将结构体比作“图纸”,结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的;

结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据、需要存储空间;

2.1结构体在内存表示;

C语言中  struct 不可少

2.2结构体初始化;

2.3结构体指针变量

2.4结构体嵌套结构体

三、结构体成员访问

3.1、结构体成员访问

结构体变量使用   .   访问;

结构体变量.对象

#include<stdio.h>
#include<string.h>
struct Date
{int year;int month;int day;
};
struct Student
{char s_name[20];struct Date birthday;float score;
};
int main()
{struct Student stu = { "liuwen",2000,10,1,99.9 };printf("name=%s\nbirtyday=%d.%d.%d\nscore=%f\n", stu.s_name, stu.birthday.year, stu.birthday.month, stu.birthday.day, stu.score);stu.score = 77;printf("name=%s\nbirtyday=%d.%d.%d\nscore=%f\n", stu.s_name, stu.birthday.year, stu.birthday.month, stu.birthday.day, stu.score);return 0;

注意:对结构体变量整体赋值有三种情况

(1)定义结构体变量(用{}初始化)

(2)用已定义的结构体变量初始化

(3)结构体类型相同的变量可以作为整体相互赋值;

在C语言中不存在结构体类型的强制转换。

3.2、结构体变量和指针

内置类型可以定义指针变量,结构体类型也可以定义结构体类型指针;

结构体类型指针访问成员的获取和赋值形式:

(1)(*p). 成员名(.的优先级高于*,(*p)两边括号不能少)

(2)   p->成员名(->指向符)

示例:

#include<stdio.h>
#include<string.h>
//#define _CRT_SECURE_NO_WARNINGS
struct Inventory//商品
{char description[20];//货物名int quantity;//库存数据
};
int main()
{struct Inventory sta = { "iphone",20 };struct Inventory* stp = &sta;char name[20] = { 0 };int num = 0;(*stp).quantity = 30;stp->quantity = 30;strcpy_s(name,sizeof(stp->description),stp->description);printf("%s %d\n", stp->description, stp->quantity);printf("%s %d\n", (*stp).description, (*stp).quantity);return 0;
}

 3.3、结构体和函数

示例:

#include<stdio.h>
#include<string.h>
#define _CRT_SECURE_NO_WARNINGS
struct School
{char s_name[20];//学校int s_age;
};
void Print_a(struct School sx)
{printf("%s %d\n", sx.s_name, sx.s_age);
}
void Print_c(struct School* sp)
{printf("%s %d\n", sp->s_name, sp->s_age);
}
int main()
{struct School sx = { "xi'an",100 };Print_a(sx);Print_c(&sx);return 0;
}

内存什么的看上面;

两种传参那个更好?通过内存可以看出来;

四、结构体与数组

结构体数组,是指数组中的每一个元素都是一个结构体类型。在实际应用中,C语言结构体数组常被用来表示有相同的数据结构的群体,比如一个班的学生,一个公司的员工等;

例如:

#include<stdio.h>
#include<string.h>
#define _CRT_SECURE_NO_WARNINGS
struct Student
{char s_name[20];//姓名int age;//年龄float score;//成绩
};
int main()
{struct Student cla[] ={{"liuwen",18,149.9},{"qnge",18,145},{"anan",19,188},};return 0;
}

五、计算结构体大小

三个规则:

(1)、结构体变量的首地址,必须是结构体变量的“最大基本数据类型成员所占字节数”的整数倍;

(2)结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍;

(3)、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节”的整数倍;

示例:假设总零地址开始(计算)

例1、

struct node
{char cha;int ia;char chb;
};
int main()
{int size = 0;struct node sd = { 'a',2,'b' };printf("%d\n", sizeof(struct node));//12return 0;
}

例2、

struct node
{char cha;char chb;int ia;
};
int main()
{int size = 0;struct node sd = { 'a','b',2 };printf("%d\n", sizeof(struct node));//12return 0;
}

为什么要理解字节对齐问题?

(1)内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问变量,但是实际上, cup并非逐字节读写内存,而是以2,4,或8的倍数的字节块来读写内存,因此就会对基本数据类型的地址作出一些限制, 即它的地址必须是2, 4或8的倍数。那么就要求各种数据类型按照一定的规则在空间. 上排列,这就是对齐。

(2)有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。

(3)由于不同平台对齐方式可能不同,如此一来,同样的结构在不同的平台其大小可能不同,在无意识的情况下,互相发送的数据可能出现错乱,甚至引|发严重的问题。

指定对齐值

预处理指令# pragma pack(n)可以改变默认对齐数。n取值是1,2, 4,8, 16。

总结

1)结构体变量的首地址,必须是MIN{"结构体最大基本数据类型成员所占字节数",指定对齐方式}大小的整数倍。
2)结构体每个成员相对于结构体首地址的偏移量,都是MIN{基本数据类型成员,指定对齐方式}大小的整数倍。
3)结构体的总大小,为MIN{结构体“最大基本数据类型成员所占字节数”(将嵌套结构体里的基本类型也算上,得出最大基本数据类型成员所占字节数),指定对齐方式} 大小的整数倍。

C语言——结构体(全)相关推荐

  1. C语言结构体(struct)最全的讲解(万字干货)

    结构体的定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构. 结构体和其他类型基础数据类型一样,例如int类型,char类型只不过结构体可以做成你想要的数据类型 ...

  2. c语言2个字符串可以相互赋值吗,c语言结构体2之变量赋值于字符串

    #include #include struct dangdang { char email[]; char name[]; char addr[]; int num; int bugnum; cha ...

  3. golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)

    文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...

  4. C语言——结构体struct与typedef的使用

    我们常常在某些C语言代码中看到有时候typedef关键字和struct一起连用定义结构体,有时候只用struct关键字直接定义结构体,在此记录两者的一些用法,给自己做一个笔记,希望对大家也有所帮助.如 ...

  5. c语言结构体变量所占字节计算,【C语言】结构体占用字节数及存储与空间分配...

    我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等. 在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取 ...

  6. ARM汇编语言实现peek()_ARM汇编之访问C语言结构体数据

    前言 本文的写作目的在于装逼,没有要产生实际价值的意思. 前几天在做编译器的项目,有一个项目团队成员一直在问我ARM汇编能不能读C语言的结构体.我心想,我这生成ARM汇编的代码是用C++写的呀,又不是 ...

  7. C语言结构体和结构体数组示例 - Win32窗口程序演示

    C语言结构体和结构体数组的使用: /* C结构体和结构体数组示例,by bobo */#include <windows.h>LRESULT CALLBACK WndProc (HWND, ...

  8. C语言结构体-大小,对齐,填充,使用及其他

    C语言结构体-大小,对齐 C语言中的结构体(struct)的定义 在C语言中,最常用的数据结构就是结构体了,结构体也是其它数据结构(比如链表等)的基础,结构体的使用非常简单. 比如,定义一个结构体: ...

  9. 关于c语言结构体偏移的一点思考

    注:此处只是利用了编译器的特性来计算结构体偏移 这句话就一笔带过,说得有点牵强附会.以后有时间自己再详细了解一下编译器的特性... more exceptional c++ 中文版 26页 https ...

最新文章

  1. DTCC:数据库安全重点在数据拷贝过程中
  2. 简介子窗口控件(api)
  3. 【组合数学】排列组合 ( 排列组合示例 )
  4. LeetCode_Convert Sorted Array to Binary Search Tree(Java实现)
  5. 采购订单审批/取消审批程序(BAPI_PO_RESET_RELEASE、BAPI_PO_RELEASE)
  6. 理解 Word2Vec 之 Skip-Gram 模型【全】
  7. vc可以实现对话框里显示html文档内容,也可以显示word内容吗,VC6中使用CHtmlView在对话框控制中显示HTML文档...
  8. 苹果Siri管理层再震荡,7年老领导出局,谷歌老兵治下要重视长期研究
  9. Bailian4019 黑色星期五【模拟】
  10. three几何线在mapbox地图显示
  11. hyper-v 中 安装 Centos 7.0 设置网络 教程
  12. 匈牙利算法求最大匹配(HDU-4185 Oil Skimming)
  13. 微型计算机控制技术扫描,微型计算机控制技术(双色)
  14. 系统设计:关于高可用系统的一些技术方案
  15. 什么是mysql联合主键_什么是联合主键
  16. ShinyApp中的表格:第三天笔记
  17. 算法笔记 简单贪心(月饼问题)
  18. Codeforces Round #578 (Div. 2) 训练总结及题解
  19. NOIP 2015 d1t2 信息传递
  20. 宋婷科幻作品连载 | 算力:幻想几何学(一)

热门文章

  1. 当遇到问题时,正视自己真实的内心
  2. JSP实现简单的用户登录和注册
  3. 数字图像处理学习笔记(十八)实现图像的离散余弦变换
  4. 正则表达式全部符号解释及示例
  5. 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列(搜狐畅游2012.10.21机试题)...
  6. 计算机毕业设计Java校园教务系统登录(源码+系统+mysql数据库+Lw文档)
  7. 网络编程二:TCP/IP协议,HPPT协议
  8. 【校内模拟】A(容斥原理)(数位DP)(范德蒙德恒等式)(高精度)
  9. 2020中国农业大学计科学硕考研经验分享
  10. c#连接kafka_confluent-kafka-dotnet-master