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

建设美食电子商务网站四川成都建设网

建设美食电子商务网站,四川成都建设网,外包服务是什么,微信网站备案文章目录 一. 结构体简述二. 结构体的声明和定义1、简单地声明一个结构体和定义结构体变量2、声明结构体的同时也定义结构体变量3、匿名结构体4、配合typedef#xff0c;声明结构体的同时为结构体取别名5、在声明匿名结构体时#xff0c;使用typedef给这个匿名结构体取别名 三… 文章目录 一. 结构体简述二. 结构体的声明和定义1、简单地声明一个结构体和定义结构体变量2、声明结构体的同时也定义结构体变量3、匿名结构体4、配合typedef声明结构体的同时为结构体取别名5、在声明匿名结构体时使用typedef给这个匿名结构体取别名 三. 结构体变量的初始化四. 结构体成员的访问方法五. 结构体大小的计算1. 计算方法2. 普通结构体3. 包含数组成员的结构体4. 成员包含结构体的结构体5. 成员包含联合体的结构体6. 空结构体的大小 六. 柔性数组1. 介绍2. 使用方法3. 柔性数组的特点 七. C 中 struct 与 class 的区别八. C 和 C 结构体的区别 一. 结构体简述 具有相同或不同类型元素的集合叫做结构体。定义一个结构体本质是在制作一个类型 // 声明一个学生信息结构体 struct Student {char name[20];int age; };int main() {// 定义出两个学生变量struct Student s1 { 张三, 18};struct Student s2 { 李四, 20};return 0; }二. 结构体的声明和定义 1、简单地声明一个结构体和定义结构体变量 在C中结构体内只能存放各种类型的变量不能存函数 像上面这样就是声明了一个结构体struct Student此时的 struct Student 相当于一个类型名。 然后我们可以用这个自己声明的结构体类型去定义变量 补充C 和 C 中定义结构体变量的区别 在 C 中使用结构体去定义变量时需要在结构体名称前加上 struct 关键字。在 C 中使用结构体去定义变量时可以不加 struct 关键字 2、声明结构体的同时也定义结构体变量 也许初期看不习惯容易困惑其实这就相当于两步合并一步先定义结构体 struct Student再定义变量 s1 和 s2 3、匿名结构体 使用方式声明结构体的时候缺失结构体名同时定义出一个或n个结构体变量 这种形式只能使用在声明结构体的同时也定义出结构体变量由于没有结构体名因此后续不可以再定义新的结构体变量。 4、配合typedef声明结构体的同时为结构体取别名 前面说过使用结构体去定义结构体变量时C 需要加 structC 不需要。那么使用结构体的别名去定义变量呢 答使用结构体别名去定义结构体变量时C 和 C 都不需要加 struct加了反而都会报错因为取别名时把struct连同结构体名称一起包含进去了。 5、在声明匿名结构体时使用typedef给这个匿名结构体取别名 这种形式声明了一个缺失结构体名的结构体但同时使用 typedef 为结构体设置了别名所以之后我们可以使用这个别名去定义结构体变量。 三. 结构体变量的初始化 先弄清楚变量初始化和赋值的区别 struct Student {char name[20];int age; };int main() {// 变量刚开始创建时给值这个叫初始化struct Student s1 {nick, 18};// 变量创建后再对它的值进行操作这个叫赋值strcpy(s1.name, tony);s1.age 24;return 0; }结构体只能被整体初始化不能被整体赋值想要赋值的话只能把成员逐个地取出来再赋值。 补充数组也是一样的道理只能整体初始化不能整体赋值。如果是字符数组想要整体赋值的话可以使用 strcpy 函数 本人推测结构体和数组不能被整体赋值的原因是它们内部空间在逻辑上是独立一块块的所以我们只能对这些独立的空间逐个赋值而不能整体赋值。 四. 结构体成员的访问方法 我们可以通过变量或变量的地址去访问结构体的成员。 struct Student {char name[20];int age; };int main() {// 1、通过变量访问结构体成员struct Student s;strcpy(s.name, 张三);s.age 18;// 2、通过指针访问结构体成员struct Student* p s;printf(%s\n, p-name);printf(%d\n, p-age);return 0; }--------结果如下-------- 张三 18为什么结构体会有两种访问方式 在函数传参传值、传址时会生成临时变量如果要传的结构体变量太大的话传值拷贝出来的临时对象也会很大如果用传地址的方式来传结构体变量地址的话可以很好的节省空间。 当然如果可以直接拿到结构体变量的话使用变量来访问结构体成员会更直观点。 五. 结构体大小的计算 1. 计算方法 结构体的大小不是结构体元素单纯相加就行的因为我们现在主流的计算机使用的都是64位字长的CPU对这类型的CPU取8个字节的数要比取一个字节要高效也更方便。所以在结构体中每个成员的首地址都是8的整数倍的话取数据元素时就会相对更高效这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”也叫对齐模数。程序员可以通过预编译命令#pragma pack(n)来改变这一系数其中的 n 就是你要指定的“对齐系数”。 但实际每个成员的类型可能是不同的每个类型对应不同大小为了更高效地读取结构体变量的成员结构体的大小要遵循一套对齐规则 第一个成员在与结构体变量偏移量为0的地址处。即结构体的首地址处即对齐到0处其他成员变量要对齐到某个数字对齐数的整数倍的地址处。结构体的总大小为最大对齐数每个成员变量都有一个对齐数的整数倍。如果嵌套了结构体嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。 对齐数 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。 PSVS中的默认对齐数为8不是所有编译器都有默认对齐数当编译器没有默认对齐数的时候成员变量的大小就是该成员的对齐数。 2. 普通结构体 第一步找出每个成员变量的大小将其与编译器的默认对齐数相比较取其较小值为该成员变量的对齐数 PS这里使用的是VS编译器故默认对齐数为8。 第二步根据每个成员对应的对齐数画出它们在内存中的相对位置 第三步通过最大对齐数决定最终该结构体的大小 通过图我们可以知道绿色部分double d成员占用红色部分char c成员占用紫色部分int i成员占用红色与紫色之间的白色部分浪费掉了总共占用了16个字节的内存空间。 我们需要将它们总共占用的内存空间16与结构体成员的最大对齐数8相比较结构体的总大小为最大对齐数的整数倍此时16正好是8的整数倍所以该结构体在VS编译器下的大小就16个字节。即创建一个该类型的结构体变量内存需为其开辟16个字节的内存空间。 PS大多数情况下成员变量已经占用的总字节个数并不一定正好为其成员变量中的最大对齐数的整数倍这时我们需要将其扩大为最大对齐数的整数倍。 3. 包含数组成员的结构体 数组应拆开来看不能看做一个整体 struct S {char a; //对齐数为1。占1个字节char c[5]; //对齐数为1。可看成5个char占5个字节int b; //对齐数为4。占4个字节因为前面所有成员占6个字节不是4//个字节的整数倍所以在第二个成员和第三个成员//之间要补2个字节 } //所以该结构体的大小为152补412个字节4. 成员包含结构体的结构体 1如果结构体成员只是说明而没有定义变量则这个结构体成员不占内存空间。 struct S {char a; //对齐数为1。占1个字节struct s{int c;char d;}; //此处结构体只声明没有定义结构体变量所以该声明//的结构体在地址空间中并不占位置int f; //对齐数为4。占4个字节double b; //对齐数为8 }; //该结构体的大小为13补4816个字节2如果内部定义并申明了其他结构体变量这时需要把这个结构体看成一个整体大小要独立计算至于对齐数取其内部最大成员的对齐数。 struct t {char a; //对齐数1struct s //对齐数4{int c; //对齐数4char d;//对齐数1}g;//此处定义并申明了结构体变量在这里需要把结构体//看成一个整体独立计算这个结构体的大小为8字节//结构体整体的对齐数是内部最大成员的对齐数//之后把这个结构体看出对齐数为4大小为8的成员char f; //对齐数1int b; //对齐数4 }; //所以该结构体的大小为13(补)813补420个字节5. 成员包含联合体的结构体 联合体的大小等同于联合体里面最大成员的大小所以可以把联合体等效成一个变量这个变量就是联合体里面最大的那个成员。 和前文所说的结构体一样如果只声明联合体没定义联合体变量则联合体就当成不存在。 struct t {char a;union s{int c;char d;double h;}g; int f;double b; };//所以该结构体的大小为17(补)844补832个字节6. 空结构体的大小 1在 VS2017 下测试 2在 Centos7 下测试 六. 柔性数组 1. 介绍 在 c99 中有明确的规定允许结构体中最后一个数组大小是未知的。 数组作为结构体的最后一个成员数组元素可以不写或写成0结构体中至少包含一个以上处数组外的其他类型的成员 struct T {int a;char b;int arr[];//或者int arr[0];};int main() {struct T t;// sizeof 求结构体大小时所求出的大小没有包括柔性数组的大小printf(%lu\n, sizeof(struct T));return 0; }--------结果如下-------- 82. 使用方法 包含柔性数组的结构体可以把整个结构体看成是变长的。 #includestdio.h #includestdlib.h #includestdlib.h struct d { int nb; int nn; int arr[]; }; int main() {//分别给结构体中其他类型的成员和柔性数组申请空间struct d *p(struct d*)malloc(sizeof(struct d)5*sizeof(int));p-nb100;p-nn50; for(int i0;i5;i){p-arr[i]i;//赋值printf(%d ,p-arr[i]);} //重新调整所申请的空间将柔性数组调整为40。struct d *pp(struct d*)realloc(p,48); if(pp!NULL){ppp;for(int i5;i10;i){p-arr[i]i;//赋值printf(%d ,p-arr[i]); } free(p);pNULL;} return 0; } --------结果如下-------- 0 1 2 3 4 5 6 7 8 9 3. 柔性数组的特点 柔性数组只需在 malloc 创建时要独立于结构体申请空间此后的 realloc 再分配空间和 free 释放都只需对一个结构体指针操作即可。柔性数组申请的内存更加集中有利于查找使用和减少内存碎片。sizeof 求结构体大小时所求出的大小没有包括柔性数组的大小。 七. C 中 struct 与 class 的区别 class 成员的默认权限为 privatestruct 成员的默认权限为 public。class 的继承默认是 private 继承struct 的继承默认是 public 继承。class 可以作为一个关键字定义模板参数与 typename 作用一样而struct 不可以。 八. C 和 C 结构体的区别 C 结构体内部可以有成员变量和成员函数而 C 中结构体只能有成员变量。C 结构体的成员变量不能在声明时给初值而 C 中可以 C 中定义结构变量时可以不在名称前面加上 struct 关键字而 C 一定要C 结构体内不能有静态成员而 C 可以。C 结构没有访问修饰限定符而 C 有。
http://www.hkea.cn/news/14389520/

相关文章:

  • 新网站收录多少关键词免费咨询皮肤科医生
  • 北京快速建站模板企业 怎么建交互网站
  • 做平面素材比较好的网站局域网建设网站工具
  • 网站系统环境的搭建水印wordpress
  • 品牌网站建设3小蝌蚪官方网站建设 招标公告
  • 自动跳转手机网站代码wordpress插件申请软著
  • 永信南昌网站建设wordpress会员付费
  • 网站开发用px还是rem网站建设维护工作经验
  • 南昌网站建设方案开发wordpress自动跳转相近链接
  • 石材网站建设seo搜索引擎优化方案
  • 网站群建设管理规定济南地铁建设
  • 深圳个性化建网站公司展厅设计收费标准
  • php网站开发技术论文互联网创业项目的效果
  • 温州企业建站系统wordpress图片优化插件
  • 网站建设构造学习wordpress中文相册插件
  • 怎么制作一个网站内容湛江网签
  • 长春制作公司网站安徽省建设工程信息网站进不了
  • 家具网站建设比较好的扶贫832网络销售平台
  • 做建网站的公司用什么做网站的访问量统计
  • 建设银行湖北省分行 网站网站建设需要客户提供什么内容
  • 手机和pc端网站建设自媒体平台运营
  • 中山网站建设 760国外做科研的网站
  • seo网站管理招聘wordpress出现的问题
  • 赶集网天津网站建设手机端网站建站手册
  • 上海网站设计大连甜品网站设计
  • 网站被黑应该怎么做巫山集团网站建设
  • 安阳专业做网站公司wordpress 手机管理
  • 公司建多个网站wordpress.php扩张
  • 做网站类的网站乐陵属于山东哪个市
  • 成都网站外包优化软件开发合同模板