自定义类型: 结构体,枚举,联合

   1.结构体

   个人认为结构体和数组特别相似,只不过结构体和数组的区别在于结构体的成员可以是不同类型,而数组成员类型是相同的。
   (1)结构体的声明
struct tag
{成员列表//至少得有一个成员
}值列表;//值列表可以省略
struct
{int a;char b;float c;
}x;//匿名结构体struct
{int a;char b;float c;
}a[5],*p;//匿名结构体
//注意上述的两个匿名结构体虽然成员列表看似相同,但编译器在进行编译的时候绝不会将这两个结构体看成是一样的结构体,所以对于*p = &x,这种看法是绝对错误的
   (2)结构体成员
     结构体成员可以是int,float,double,char等基本类型,也可以是数组,指针,甚至结构体,枚举等都可以。结构体成员在访问的时候采用结构结构体.成员名的方式来访问如:
#include<stdio.h>
struct Student
{char name[20];int age;int grade;
};//学生类结构体
int main()
{struct Student student;.//定义一个学生结构体printf("%s\n", student.name);printf("%d\n", student.age);printf("%d\n", student.grade);return 0;
}
   由上可以看出,结构体的定义通过struct 结构体名来定义一个变量,但需要注意,单独的声明一个结构体类型,系统不为之开辟空间。
   举个例子
struct Student
{char name[20];int age;int grade;
};//系统不为它开辟内存空间
struct Student student;//系统为之开辟内存空间
   (3)结构体成员的访问
    结构体成员的访问采用.的方式访问,当有结构体指针的时候必须先对其解引用或者是结构体指针名 -> 成员名才可对其成员访问。
    举个例子
#include<stdio.h>struct Student
{char name[20];int age;int grade;
};//学生类结构体
int main()
{struct Student student;.//定义一个学生结构体stuct Student* student1;printf("%s\n", student.name);printf("%d\n", student.age);printf("%d\n", student.grade);printf("%d\n", (*student1).grade);//解引用的方式printf("%d\n", student1 -> age);//箭头的方式return 0;
}
   (4)结构体的自引用
//方案一
struct Student
{char name[20];char sex[5];int age;struct Student* student;
};//方案二
typedef struct Student
{char name[20];char sex[5];int age;struct Student* Next;
}Student;//typedef定义一个新类型Student,以后在定义变量的时候可以直接用Student去定义一个结构体变量,而不用再用struct Student
   (5)结构体的初始化
struct Student
{char name[20];char sex[5];int age;int grade;
};
//方案一整体赋值
struct Student student = {"张三", "男", 20, 90};//方案二逐个赋值
struct Student student1;
strcpy(student1.name, "李四");
strcpy(student1.sex, "男");
student1,age = 20;
student1.grade = 89;
   (6)结构体的内存对齐
   结构体大小的计算
    几条规则
        1.结构体的第一个成员始终对齐于偏移量为0的地址(offsetof(结构体名, 成员名))处
        2.后面的结构体成员对齐与某个数字(对齐数)的整数倍的地质处。其中对齐数在VS上默认是8,在Linux上默认是4。其中*对齐数* = 默认对齐数和自身成员大小的较小值
        3.结构体的总大小为最大对齐数
        4.结构体如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍的地址处。
    举个例子
//VS下
#include<stdio.h>
int main()
{struct S1{char c1;//1int i;//3 4char c2;//1};//12struct S2{char c1;//1char c2;//1int i;//2 4};//8struct S3{double d;//8char c;//1int i;//3  4};//16struct S4{char c1;//1struct S3 s3;//7 16double d;//8};//32printf("%d\n", sizeof(struct S1));//12printf("%d\n", sizeof(struct S2));//8printf("%d\n", sizeof(struct S3));//16printf("%d\n", sizeof(struct S4));//32return 0;
}
     不同平台对地址的访问要求不同,不是所有的硬件平台都可以访问任意地址的数据,有的硬件平台规定某些平台只能访问某些特定的数据,所以当访问不正确是会出现错误,而且如果没有内存对其,有的数据本来一次可以访问到,但却要两次访问,这样大大降低了内存的访问速度,因此便有了结构体的内存对其。
   (7)结构体传参
     结构体在传参时为了节省内存,在传参时采用地址传参,同时要对其成员进行访问时可以通过对其地址解引用的方式访问其成员
   (8)结构体的位段
     举个例子
struct A
{int _a:2;int _b:5;int _c:10;int _d:30;
};//位段类型
printf("%d\n",sizeof(struct A));//不同平台结果不一样
    A.位段的内存分配
     a.位段成员只能是整型家族int,unsigned int , signed int,char
     b.不跨平台
     c.按一字节或四字节方式分配
    B位段中的问题
      a.将其当成有符号还是无符号不确定
      b.成员内存从左分配还是从右分配不确定
      c.当包含多个位段时,前一个位段所剩余内存应该舍弃还是保存都不确定
      d.位段中最大位的数目不同机器不同

   2.枚举

   (1)枚举定义
      将有限个可能取值都一一列举出来
enum Sex
{MALE,FEMALE,SECRET
};
   (2)枚举的优点
      A.增加代码可读性和可维护性
      B.比起宏定义来,枚举对类型检查较为严谨
      C.使用方便,一次可以定义多个变量
      D.具有一定的封装代码作用

   3.联合体

   (1)联合特点
      联合体公用一块内存空间
#include<stdio.h>int main()
{union Un1{char c[5];//1int i;//4};//最大是5,但5不是最大对其数的倍数,所以是8union Un2{short c[7];//2  int i;//4};//最大是2 * 7 = 14, 但14不是最大对齐数4的倍数,所以变成了16printf("%d\n", sizeof(union Un2));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解C++中的函数调用和下标以及成员访问运算符的重载

http://www.jb51.net/article/78436.htm 这篇文章主要介绍了详解C中的函数调用和下标以及成员访问运算符,讲到了这些二元运算符使用的语法及重载,需要的朋友可以参考下函数调用 使用括号调用的函数调用运算符是二元运算符。 语法 ?1primary-expression ( expression-list )备…

A计划——BFS

【题目描述】 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后&#xff0c;而今&#xff0c;不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主&#xff0c;因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚&#xff0c;告招天下勇士…

使用openssl的md5库

http://blog.csdn.net/sinat_35297665/article/details/78244523 在linux机器上&#xff0c;有一个命令可以计算出文件的md5值&#xff0c;那就是md5sum&#xff0c;如果没有的话&#xff0c;就需要安装RPM包&#xff1a;coreutils。 现在我们使用openssl的库也可以方便的计算出…

主席树入门

今天学习了一下主席树&#xff08;名字这么强的嘛&#xff09; 虽然直接理解起来不容易&#xff0c;但是这种解决问题的思想其实并不陌生。 我们可以首先来看维护整个区间第K大的线段树 我们将[l,r]区间内数字的多少用线段树进行维护&#xff0c;这样的话为了求取区间第k大&…

Socket网络编程--小小网盘程序(1)

http://www.cnblogs.com/wunaozai/p/3886588.html 这个系列是准备讲基于Linux Socket进行文件传输。简单的文件传输就是客户端可以上传文件&#xff0c;可以从服务器端下载文件。就这么两个功能如果再加上身份验证&#xff0c;就成了FTP服务器了&#xff0c;如果对用户的操作再…

使用 Verdaccio 构建自己的私有 npm 仓库

前言 无论你是公司的开发者&#xff0c;还是个人开发者&#xff0c;你可能都听说过或者使用过 npm&#xff0c;这是一个使用广泛的 JavaScript 包管理器。但是&#xff0c;你是否遇到过以下的问题&#xff1a;你需要一个私有的包存放地方&#xff0c;或者你需要在离线环境下使…

HDU - 4348To the moon——主席树+区间修改

HDU - 4348To the moon 【题目描述】 【题目分析】 题目中说明每次更新后时间都会加1&#xff0c;而且还会需要查询以前的区间&#xff0c;还会需要返回以前的时间&#xff0c;所以是很裸的主席树。区间查询的话我们同样需要用到lazy标记 通过这道题我发现线段树的操作还是很灵…

进入一个目录需要那些权限

1.文件访问者的分类 文件的访问者具体可分为以下几类&#xff1a; (1)拥有者 (2)组拥有者 (3)其他用户 这些都代表什么意思呢&#xff1f; 其中r表示只读&#xff0c;w表示只写&#xff0c;x表示可执行&#xff0c;第一个字母代表了文件的类型&#xff0c;其中文件类型可以分为…

Socket网络编程--小小网盘程序(2)

http://www.cnblogs.com/wunaozai/p/3887728.html 这一节将不会介绍太多的技术的问题&#xff0c;这节主要是搭建一个小小的框架&#xff0c;为了方便接下来的继续编写扩展程序。本次会在上一小节的基础上加上一个身份验证的功能。 因为网盘程序不像聊天程序&#xff0c;网盘是…

Linux下的重要目录

1.bin目录 主要防止系统下的各种必备可执行文件 2./proc 目录 这个目录相当于Windows下的计算机系统信息查看以及进程动态查看&#xff0c;可以查看计算机信息&#xff0c;用来存放当前计算机上的进程信息 3./sys 目录 (1)其中block目录用于存放块设备文件 (2)bus存放总线类型…

HDU - 6278 Just $h$-index主席树+二分

HDU - 6278 Just hhh-index 【题目描述】 【题目分析】 题目要求在区间[l,r][l,r][l,r]内大于h的数不少于h个&#xff0c;对于这种最大化问题&#xff0c;我们应该想到二分。 最小情况显然是1.最大情况显然是r−l1r-l1r−l1&#xff0c;对于一个hhh&#xff0c;我们如何判断能…

Socket网络编程--小小网盘程序(3)

http://www.cnblogs.com/wunaozai/p/3891062.html 接上一小节&#xff0c;这次增加另外的两张表&#xff0c;用于记录用户是保存那些文件。增加传上来的文件的文件指纹&#xff0c;使用MD5表示。 两张表如下定义: 1 create table files(2 fid int,3 filename varchar(64),4 md…

LInux下du, df, top, free, pstack, su, sudo, adduser, password命令

1.du命令&#xff1a;du [选项] 文件 (1)功能该命令是显示指定文件以及下的所有文件占用系统数据块的情况&#xff0c;如果没有文件&#xff0c;默认为是当前工作目录 -a    显示所有文件对系统数据块的使用情况 -b    显示数据块大小时以字节为基本单位 -c    除了显…

HDU - 5919 Sequence II——主席树+区间种类++逆序建树

【题目描述】 HDU - 5919 Sequence II 【题目分析】 题目给定一个数组&#xff0c;每次查询一个区间&#xff0c;找出区间内不同数字的个数x&#xff0c;然后输出按出现顺序第x/2向上取整个数字的位置。 按照要求&#xff0c;我们首先需要能够找出给定区间不同的数字个数。 首…

Socket网络编程--小小网盘程序(4)

http://www.cnblogs.com/wunaozai/p/3892729.html 在这一小节中实现了文件的下载&#xff0c;具体的思路是根据用户的uid和用户提供的文件名filename联合两张表&#xff0c;取得md5唯一标识符&#xff0c;然后操作这个标识符对应的文件发送给客户端。 实现下载的小小网盘程序 …

静态顺序表的实现

实现对顺序表的初始化&#xff0c;头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删&#xff0c; 任意下标的删除&#xff0c; 任意下标处的的元素删除&#xff0c;任意下标处的元素插入&#xff0c;任意元素的下标返回&#xff0c;任意下标处的元素返回&#xff0c; 删除…

树链剖分入门+HYSBZ - 1036树的统计Count

今天学习了树链剖分&#xff0c;记录一下。 【题目背景】 HYSBZ - 1036树的统计Count 【题目分析】 题目要求求任意结点之间路径的和以及路径上最大的结点&#xff0c;还有可能修改。如果正常做可能会很复杂&#xff08;我也不知道正常应该怎么做&#xff0c;应该要用到LCA什么…

Socket网络编程--小小网盘程序(5)

http://www.cnblogs.com/wunaozai/p/3893469.html 各位好呀&#xff01;这一小节应该就是这个小小网盘程序的最后一小节了&#xff0c;这一节将实现最后的三个功能&#xff0c;即列出用户在服务器中的文件列表&#xff0c;还有删除用户在服务器中的文件&#xff0c;最后的可以共…

进程相关概念

1.进程相关概念 进程是代码的一次动态执行&#xff0c;担当分配系统资源的角色&#xff0c;进程信息是被放在一个一个数据结构中&#xff0c;是一个结构体task_struct 2.进程控制块内容 //linux下的进程控制块 struct task_struct {volatile long state;// 说明了该进程是否可以…

SPOJ - QTREE3Query on a tree again!——树链剖分

【题目描述】 SPOJ - QTREE3Query on a tree again! 【题目分析】 题目要求是输出从111到xxx的路径上遇到的第一个黑色的点。我们可以用树链剖分&#xff08;不了解的同学请出门左拐&#xff0c;详见树链剖分入门&#xff09; 我们用线段树维护每个区间第一次遇到黑点的位置&a…