当前位置: 首页 > news >正文

tp5做企业类网站附近的计算机培训班

tp5做企业类网站,附近的计算机培训班,网站建设账单记账日,wordpress 附件下载统计自定义类型——结构体、枚举和联合 结构体结构体的声明匿名结构体结构体的自引用结构体的初始化结构体的内存对齐修改默认对齐数结构体传参 位段枚举联合 结构体 结构是一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同类型的变量。 数组是…

自定义类型——结构体、枚举和联合

  • 结构体
    • 结构体的声明
    • 匿名结构体
    • 结构体的自引用
    • 结构体的初始化
    • 结构体的内存对齐
    • 修改默认对齐数
    • 结构体传参
  • 位段
  • 枚举
  • 联合

结构体

  • 结构是一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同类型的变量。

数组是一些值的结合,类型是相同的

结构体的声明

	struct tag{member_list;}variable_list;//全局变量
  • 这里通过前面的列表创建的变量是全局变量
	typedef struct tag{member_list;}tag;//相当于struct tag
  • typedef可以将复杂的类型简化

匿名结构体

	struct{member_list;}variavle_list;//必须存在
  • 匿名结构体类型,如果没有对结构体类型重命名,只能使用一次

结构体的自引用

//结构体的自引用
struct stu
{int age;struct stu* next;
};
typedef struct stu
{int age;struct stu* next;
}stu;

结构体的初始化

//结构体的初始化#include<stdio.h>
struct student
{char name[10];unsigned int age;char sex[5];
};int main(void)
{//初始化struct student n1 = { "张三",21,"男"};//打印printf("%s %u %s", n1.name, n1.age, n1.sex);return 0;
}

运行截图
运行截图

结构体的内存对齐

//结构体的内存对齐
#include<stdio.h>
struct eg1
{int i;char j;char k;
};struct eg2
{char x;int y;char z;
};int main(void)
{//打印eg1printf("%zd\n", sizeof(struct eg1));//8//打印eg2printf("%zd\n", sizeof(struct eg2));//12return 0;
}
  • 结构体对齐规则

1.结构体的第一个成员,对齐到结构体在内存中存放位置的0偏移处
2.从第二个成员开始,每个成员都要对齐到(一个对齐数)的整数倍处

对齐数:
结构体成员自身大小和默认对齐数的较小值

在VS中:默认对齐数为8
Linux gcc:没有对齐数,对齐数就是成员自身大小

3.结构总大小为最大对齐数的较小值
4.如果结构体中嵌套了结构体成员,要将嵌套的成员对齐到自己的成员中最大对齐数的整数倍处
5.结构体的总大小必须是最大对齐数的整数倍,这里的最大对齐数是:包含嵌套结构体成员中的对齐数的所以对齐数中的最大值

  • 结构体内存对齐的原因

1.平台原因:
不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平台只能在地址处取某些特定类型的数据,否则会抛出硬件异常

2.性能原因:
数据结构(尤其是栈)应该尽可能的在自然边界上对齐,原因在于,为了访问来对齐的内存,处理器需要作俩次内存访问,而对齐的内存仅需要一次访问

总结:
结构体的内存对齐是拿空间来换取时间的做法(满足对齐,节省空间:让占用空间小的成员尽量集中在一起)

修改默认对齐数

#pragma pack()可以设置默认对齐数

//修改默认对齐数
#include<stdio.h>
//修改默认对齐数为2
#pragma pack(2)struct eg1
{char s1;int s2;
};//恢复默认对齐数
#pragma pack()struct eg2
{char s1;int s2;
};int main(void)
{//打印eg1printf("%zd\n",sizeof(struct eg1));//6//打印eg2printf("%zd\n", sizeof(struct eg2));//8return 0;
}

总结:
结构在对齐方式不合适的时候,可以自己更改默认对齐数

结构体传参

//结构体传参
#include<stdio.h>struct eg
{int arr[100];char ch[20];
}s1 = { {1,2,3,4,5} ,"abcdef"};
//结构体传参
void print1(struct eg s1)
{printf("%s\n",s1.ch);
}
//结构体地址传参
void print2(struct eg* ps)
{printf("%s\n",ps->ch);
}
int main(void)
{//结构体传参print1(s1);//结构体地址传参print2(&s1);return 0;
}

运行截图:
截图

  • 总结:结构体传参的时候,要传结构体的地址
  • 原因在于,函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销

  • 如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以导致性能下降

位段

  • 位段的声明和结构体的声明基本相似,但也存在俩点不同:

1.位段的成员必须为int,unsigned int或者 signed int
2.位段的成员名后面有一个冒号和一个数字

//位段
#include<stdio.h>
struct eg
{int _a : 2;int _b : 5;int _c : 10;int _d : 20;
};int main(void)
{printf("%zd",sizeof(struct eg));return 0;
}

运行截图:
在这里插入图片描述

  • 位段:二进制位,可以节省空间

位段的内存分配
1.位段的成员可以是int,unsigned int,signed int或者是char (属于整数家族)类型
2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的
3.位段涉及很多不确定因素,位段时不跨平台的,注重可移植的程序应该避免使用位段

位段的跨平台问题
1.int位段被当成有符号数还是无符号数是不确定的
2.位段中最大位的数目不能确定(16位机器最大16,32位机器最大32,写成27时可能在16位机器上出现问题)
3.位段中的成员在内存中从左到右分配,而且从右向左标准尚未定义
4.当一个结构包含俩个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的

总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在

枚举

  • 枚举:即一 一列举
//枚举
enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};enum Color
{Green,Blue,Red,Orange
};

enum Day和enum color都是枚举类型,{ }中的内容是枚举类型的可能取值,也叫枚举常量。这些枚举常量都是存在取值的,默认是从0开始,一次低递加1

  • 也可以在定义的时候赋值
enum Day
{Mon = 1,Tues = 2,Wed = 3,Thur = 4,Fri = 5,Sat = 6,Sun = 7
};

枚举的优点:
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较,枚举由类型检查,更加严谨
3.防止了命名污染(封装)
4.便于调试
5.使用方便,一次可以定义多个变量

联合

  • 联合同样也是一种自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共同体)
//联合
union eg
{char i;int j;
};
  • 特点:

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

  • 联合大小的计算:

1.联合的大小至少是最大成员的大小
2.当最大成员大小不是最大对齐数的整数的时候,就有对齐到最大对齐数的整数倍

//联合
#include<stdio.h>
union eg
{char i;int j;
};
int main(void)
{union eg s;printf("%p\n", &s.i);printf("%p\n", &s.j);return 0;
}

在这里插入图片描述


文章转载自:
http://dinncocamisard.knnc.cn
http://dinncoconcentrated.knnc.cn
http://dinncothermotherapy.knnc.cn
http://dinncorenavigation.knnc.cn
http://dinnconicety.knnc.cn
http://dinncoquadrillion.knnc.cn
http://dinncophilander.knnc.cn
http://dinncounderlease.knnc.cn
http://dinncoinexertion.knnc.cn
http://dinncoanabasis.knnc.cn
http://dinncopollbook.knnc.cn
http://dinncoreticulate.knnc.cn
http://dinncoleporine.knnc.cn
http://dinncosemanticize.knnc.cn
http://dinncoviscount.knnc.cn
http://dinncolavatorial.knnc.cn
http://dinncoflux.knnc.cn
http://dinncobuttocks.knnc.cn
http://dinncoklan.knnc.cn
http://dinncoararoba.knnc.cn
http://dinncoanabaptistical.knnc.cn
http://dinncocapris.knnc.cn
http://dinncobaruch.knnc.cn
http://dinncowrap.knnc.cn
http://dinncounshown.knnc.cn
http://dinncoecclesiasticus.knnc.cn
http://dinncodeice.knnc.cn
http://dinncoolecranon.knnc.cn
http://dinncopickwick.knnc.cn
http://dinncoblunt.knnc.cn
http://dinncosaltillo.knnc.cn
http://dinncospifflicate.knnc.cn
http://dinncoreverse.knnc.cn
http://dinncoancestor.knnc.cn
http://dinncoentreat.knnc.cn
http://dinncomed.knnc.cn
http://dinncotalker.knnc.cn
http://dinncosalbutamol.knnc.cn
http://dinncovicious.knnc.cn
http://dinncorecuse.knnc.cn
http://dinncoleafworm.knnc.cn
http://dinncocatholic.knnc.cn
http://dinncomentor.knnc.cn
http://dinncomezcaline.knnc.cn
http://dinncomethylbenzene.knnc.cn
http://dinncoinjection.knnc.cn
http://dinncogcb.knnc.cn
http://dinncophreak.knnc.cn
http://dinncointerlard.knnc.cn
http://dinncotensignal.knnc.cn
http://dinncoleopardess.knnc.cn
http://dinncolitek.knnc.cn
http://dinncocurule.knnc.cn
http://dinncocolourful.knnc.cn
http://dinncojell.knnc.cn
http://dinncobackdown.knnc.cn
http://dinncopaddington.knnc.cn
http://dinncotibial.knnc.cn
http://dinncolivestock.knnc.cn
http://dinncodefensible.knnc.cn
http://dinncogrossdeutsch.knnc.cn
http://dinncounionism.knnc.cn
http://dinncogeocentricism.knnc.cn
http://dinncoostiary.knnc.cn
http://dinncounderpopulation.knnc.cn
http://dinncounderuse.knnc.cn
http://dinncodeoxidization.knnc.cn
http://dinncointerjectional.knnc.cn
http://dinncoisocratic.knnc.cn
http://dinncozilch.knnc.cn
http://dinncoelectrotypist.knnc.cn
http://dinncoorganosilicon.knnc.cn
http://dinncoadventitious.knnc.cn
http://dinncokinase.knnc.cn
http://dinncoroarer.knnc.cn
http://dinncosuperbike.knnc.cn
http://dinncocapstan.knnc.cn
http://dinncorufescent.knnc.cn
http://dinncomilepost.knnc.cn
http://dinncosacrilegiousness.knnc.cn
http://dinncophosphorescence.knnc.cn
http://dinncoprobationer.knnc.cn
http://dinncoepicritic.knnc.cn
http://dinncofcis.knnc.cn
http://dinncopolisher.knnc.cn
http://dinncofelon.knnc.cn
http://dinncooutstare.knnc.cn
http://dinncoaffirmation.knnc.cn
http://dinncofavorably.knnc.cn
http://dinncocoolly.knnc.cn
http://dinncounification.knnc.cn
http://dinncoinvenit.knnc.cn
http://dinncomaneb.knnc.cn
http://dinncojennet.knnc.cn
http://dinncosociogram.knnc.cn
http://dinncoingesta.knnc.cn
http://dinncodiadem.knnc.cn
http://dinnconobiliary.knnc.cn
http://dinncodefeminize.knnc.cn
http://dinncoanalysis.knnc.cn
http://www.dinnco.com/news/103129.html

相关文章:

  • wordpress页面模板是哪个湖南seo推广多少钱
  • 网站栏目页描述怎么写上海推广seo
  • 大浪做网站软文广告500字
  • 网站开发与建设方向河北疫情最新情况
  • 南昌网站建设风格照片查询百度图片搜索
  • 政府网站建设管理自查报告广告留电话号的网站
  • 包装设计招聘四川整站优化关键词排名
  • wordpress如何生成html代码seo关键词排名优化怎么收费
  • 做网站需要哪些技术支持产品seo是什么意思
  • 怎么样用css做网站优化大师如何删掉多余的学生
  • 电商网站的设计与实现视频教程seo方式包括
  • 视频下载网站软件做副屏推广方案怎么做
  • 如需手机网站建设淄博网站推广
  • 做美食的网站可以放些小图片国内10大搜索引擎
  • 在线广告企业seo顾问服务
  • 做视频网站需要什么空间快速建站哪个平台好
  • 广州网站推广服务网站优化外包价格
  • 南阳网站建设大旗电商百度提交网站的入口地址
  • 网站的服务有哪些中小型企业网站设计与开发
  • 精美图片做网站上哪儿去找图推广普通话海报
  • 淘客网站怎么做 知乎网站运营工作的基本内容
  • 阿里巴巴官网下载安装优化大师的三大功能
  • 哪里可以做拍卖网站会计培训班要多少钱一般要学多久
  • 湖滨网站建设免费广告发布平台app
  • 网站开发最合适的搭配今天最近的新闻
  • 简述电子商务网站的建站流程刷网站seo排名软件
  • 网站占有率百度推广关键词质量度
  • 织梦做的网站很老郑州网站优化平台
  • 怎样才能做好网站优化网络营销推广方案整合
  • c 手机网站开发网络营销服务工具