结构体类型

c的详细学习(10)结构体与共用体的学习(二)

橙三吉。 提交于 2020-02-11 04:47:24
在c语言中,结构体数据类型与共用体数据类型都属于构造类型。共用体与结构体数据类型在定义上十分相似,但它们在存储空间的占用分配上有本质的区别。结构体变量是各种类型数据的集合,各成员占据不同的存储空间,而共用体变量的所有成员占用相同的存储空间,在某一时刻只有一个成员起作用。 (1)共用体类型的定义 定义共用体类型的一般形式: union 共用体类型名 { 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名3; ...... }; 以上定义了一个名为data的共用体类型。它说明该类型由三个不同类型的成员组成,这些成员共享同一块存储空间。 (2)共用体变量的定义 与结构体变量的定义类似; (3)共用体变量的引用和初始化 1.引用共用体变量中的一个成员 引用共用体变量的成员的一般形式 共用体变量名.成员名 共用体指针变量->成员名 第一种引用方式应用于普通共用体变量,第二种引用方式应用于共用体指针变量。 union data a,*p=&a; 2.共用体类型变量的整体引用 可以将一个共用体变量作为一个整体赋给另一个同类型的共用体变量。例如: union data a,b; ...... a=b; 3.共用体变量的初始化 在共用体变量定义的同时只能用第一个成员的类型值进行初始化,共用体变量初始化的一般形式: union 共用体类型名 共用体变量={第一个成员的类型名}; 例如:

C语言------结构体和共同体

给你一囗甜甜゛ 提交于 2020-02-11 01:07:37
1.结构体是一种构造类型,它是由若干成员组成的,其中每个成员可以是一个基本数据类型或者是一个构造类型。声明结构体时使用关键字struct。 2..声明一个结构体表示的是创建一个新的类型名,要用新的类名再定义变量,定义方式有三种:   A.声明结构体,然后再定义变量。     struct Product     {成员列表};     struct Product product1;     struct Product product2;   B.在声明结构类型时,同时定义变量。     struct Product     {       char cName[10];       char cShape[20];     }product1, product2;     PS:注意变量的名称要放在最后的分号前面;定义的变量不是只能有一个,可以定义多个变量    C.直接定义结构体类型变量。     struct     {       成员列表     }变量名列表; 3.在引用结构体的成员时,可以在结构的变量名的后面加上成员运算符"."和成员的名字,例如:product1.cName 4结构体类型与其他基本类型一样,可以在定义结构体变量时指定初始值。例如:   struct Student   {     char cName[20];     char cSex;    

c中结构体边界对齐

社会主义新天地 提交于 2020-02-10 23:10:28
原则1、普通数据成员对齐规则:第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2、结构体成员对齐规则:如果一个结构里有某些结构体成员,则该结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3、结构体大小对齐规则:结构体大小也就是sizeof的结果,必须是其内部成员中最大的对齐参数的整数倍,不足的要补齐。 补 充一点,如果数组作为结构体成员,比如:char a[3]。它的对齐方式和分别写3个char是一样的,也就是说它还是按1个字节对齐。如果写: typedef char Array3[3];Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度3对齐。如果共用体作为结构体成员,则该共用体成员要从其内部 最大元素大小的整数倍地址开始存储。 例1:struct { short a1; short a2; short a3; }A; struct{ long a1; short a2; }B; sizeof(A) = 6; 这个很好理解,三个short都为2。 sizeof(B) = 8; 这个比是不是比预想的大2个字节

结构体在内存中的存储

柔情痞子 提交于 2020-02-10 23:06:33
结构体对齐原因有很大部分是因为计算机扫描的内存单元个数,也就是数据总线的大小。 原则1:数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3:收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。 这三个原则具体怎样理解呢?我们看下面几个例子,通过实例来加深理解。 例1:struct{ short a1; short a2; short a3; }A; struct{ long a1; short a2; }B; sizeof(A) = 6; 这个很好理解,三个short都为2。 sizeof(B) = 8; 这个比是不是比预想的大2个字节?long为4,short为2,整个为8,因为原则3。 例2:struct A{ int a; char b; short c; }; struct B{ char b; int a; short

成绩统计--(入门组--结构体)

a 夏天 提交于 2020-02-10 19:58:27
题目描述 ​ 兴趣小组收集学员成绩信息,每个学员的成绩用两种表示方法,一种用best、good、poor三种等级来表示,还有一种就是直接用分数来表示(百分制)。 ​ 请保存学员成绩信息,并且统计有多少人使用等级来表示成绩的,用分数来表示成绩的人的平均分是多少(取整)。 输入 ​ 第1行一个正整数n,表示学员人数n≤1000​。 ​ 第2 ~​ n+1,每行一个字符和一个字符串,中间用一个空格隔开。第一个字符表示这个学生成绩类型,有C、N两种分别代表等级表示和分数表示,第二个字符串表示成绩信息。 输出 ​ 一行两个整数,分别表示用等级表示成绩的人数和用分数表示成绩人的平均分(取整),中间用一个空格隔开。 样例输入 5 C best C good N 90 C poor N 98 样例输出 3 94 AC 代码 #include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; struct student { int score; char name; char level[100]; } stu[n]; int s = 0, l = 0; for (int i = 0; i < n; i++) { cin >> stu[i].name; if (stu[i].name == 'C') { gets

C内存对齐

一世执手 提交于 2020-02-10 18:55:38
1.C语言中的结构体 1.1 定义 结构体 是由一系列相同或不同类型的变量组成的集合。 struct 结构体名{ //struct为关键字,“结构体名”为用户定义的 类型标识 。 数据类型1 成员名1; //{ }中是组成该结构体的成员,其中数据类型可以是C语言所允许的任何数据类型。 数据类型2 成员名2; ... 数据类型n 成员名n; }; 1.2 结构体的内存分配(方法一) 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。 原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。 例1. struct A{ struct B{ int a; char b; char b; int a; short c; short c; };

结构体struct 与 联合union

馋奶兔 提交于 2020-02-10 18:55:03
1.C语言中的结构体 1.1 定义 结构体 是由一系列相同或不同类型的变量组成的集合。 struct 结构体名{ //struct为关键字,“结构体名”为用户定义的 类型标识 。 数据类型1 成员名1; //{ }中是组成该结构体的成员,其中数据类型可以是C语言所允许的任何数据类型。 数据类型2 成员名2; ... 数据类型n 成员名n; }; 1.2 结构体的内存分配(方法一) 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。 原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。 例1. struct A{ struct B{ int a; char b; char b; int a; short c; short c; };

学习结构体和union大小的问题

时光总嘲笑我的痴心妄想 提交于 2020-02-10 18:54:23
5分钟搞定内存字节对齐 转载: http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx 请牢记以下3条原则:(在没有#pragma pack宏的情况下) 1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。 2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.) 3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐. 等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟: typedef struct bb { int id; //[0]....[3] double weight; //[8].....[15]      原则1 float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3 }BB; typedef struct aa { char name

C语言-结构体struct-联合体union-枚举enum

耗尽温柔 提交于 2020-02-10 18:53:35
结构体 在Java中,我们要表示一个复合的数据类型就会使用对象去封装。而C就有结构体。 结构体是C语言中自定义的数据类型,是一组变量的集合,有别于数组,数组仅限于同一种数据类型,而结构体可以是任何数据类型,包括数组。结构体里面的每一个变量或者数组都是结构体的成员。 下面来看看结构体的基本使用 14-18行,定义了一个名称为Person的结构体,结构体里面有 age,money,sex 三种数据类型; 20-24行,是结构体的声明一个名为 P 的 Person 变量,并赋值; 25-27行,是结构体的基本使用,从中可以看出的是,结构体取值的时候和Java中极为相似,都是中间 . 的形式进行取其中某个变量的值。 下面来看一下 结构体指针的使用。 29-30行,定义了一个结构体指针,名为 pi,并将结构体变量 p 的地址赋值给 pi 。 32行,结构体指针的使用,既然 pi 是结构体 p 的指针,那么,取结构体那就是前面加个 * 咯,就这么简单,照葫芦画瓢嘛,现在取到了结构体 p,那么去 p 里面的就简单了,直接使用前面的方式中间加个 . 即可; 33行,则是指针结构体的另一种使用方式,直接使用 -> 就可以取里面相应的值了,比32行的方式是不是假单很多呢? 结构体的长度 结构体和结构体指针都说完了,最后来看一下结构体的长度。 长度简单嘛,直接把里面的累加不就得了,int 和 float

python调用golang编写的动态链接库

末鹿安然 提交于 2020-02-09 07:42:18
楔子 我们都知道python的效率很低,但是好在可以和C语言无缝结合,C语言写好扩展模块之后再让python去调用简直不要太方便。但是使用C编写扩展模块也不是件容易的事情,于是笔者想到了go,go的效率虽然不如C,但是也没有逊色太多。而且go毕竟是一门高级语言,丰富的标准库、数据类型,编写扩展模块比C方便太多了。下面我们就来看看如何使用golang编写扩展模块交给python调用。 另外python和go之间进行交互,本质上是通过C语言来作为媒介的。在go中定义函数,参数和返回值需要是C中的类型,python调用时,参数和返回值也要指定为C中的类型。而这里只会介绍golang和C中的类型如何转换,至于python的类型和C的类型如何转换我只会直接拿来用,就不写注释介绍具体的用法了。因为python和C中的类型如何转换,比如如何在python中实现C中的数组、结构体等等,我在另一篇博客中 https://www.cnblogs.com/traditional/p/12243307.html 已经介绍的比较详细了,如果对python类型和C的类型之间的转化不是很清楚的小伙伴,可以先去看一看。 举个小栗子 package main import "C" //export age_incr_1 func age_incr_1(age int) int { return age + 1 }