当前位置:文档之家› c++中关于结构体长度的计算问题

c++中关于结构体长度的计算问题

c++中关于结构体长度的计算问题
c++中关于结构体长度的计算问题

[C++]字节对齐与结构体大小

[C++] 2010-09-24 21:40:26 阅读172 评论0 字号:大中小订阅

说明:

结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不至于误导他人。

一、解释

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如

有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。

二、准则

其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

三、基本概念

字节对齐:计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据占4个字节,字符型(char)数据占一个字节,短整型(short)数据占两个字节,等等。计算机为了快速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储在地址能被4整除的起始位置,字符型数据(char)可以存放在任何地址位置(被1整除),短整型(short)数据存储在地址能被2整除的起始位置。这就是默认字节对齐方式。

四、结构体长度求法

1.成员都相同时(或含数组且数组数据类型同结构体其他成员数据类型):

结构体长度=成员数据类型长度×成员个数(各成员长度之和);

结构体中数组长度=数组数据类型长度×数组元素个数;2.成员不同且不含其它结构体时;

(1).分析各个成员长度;

(2).找出最大长度的成员长度M(结构体的长度一定是该成员的整数倍);

(3).并按最大成员长度出现的位置将结构体分为若干部分;

(4).各个部分长度一次相加,求出大于该和的最小M的整数倍即为该部分长度

(5).将各个部分长度相加之和即为结构体长度

3.含有其他结构体时:

(1).分析各个成员长度;

(2).对是结构体的成员,其长度按b来分析,且不会随着位置的变化而变化;

(3).分析各个成员的长度(成员为结构体的分析其成员长度),求出最大值;

(4).若长度最大成员在为结构体的成员中,则按结构体成员为分界点分界;

其他成员中有最大长度的成员,则该成员为分界点;

求出各段长度,求出大于该和的最小M的整数倍即为该部分长度

(5).将各个部分长度相加之和即为结构体长度

五、空结构体

“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。

六、有static的结构体

静态变量存放在全局数据区内,而sizeof计算栈中分配的空间的大小,故不计算在内,S4的大小为4+4=8。

七、举例说明

1.举例1

很显然默认对齐方式会浪费很多空间,例如如下结构:

本来只用了11bytes(5+4+2)的空间,但是由于int型默认4字节对齐,存放在地址能被4整除的起始位置,即:如果name[5]从0开始存放,它占5bytes,而num则从第8(偏移量)个字节开始存放。所以sizeof(student)=16。于是中间空出几个字节闲置着。但这样便于计算机快速读写数据,是一种以空间换取时间的方式。其数据对齐如下图:

如果我们将结构体中变量的顺序改变为:

则,num从0开始存放,而name从第4(偏移量)个字节开始存放,连续5个字节,score从第10(偏移量)开始存放,故sizeof(student)=12。其数据对齐如下图:

如果我们将结构体中变量的顺序再次改为为:

则,sizeof(student)=12。其数据对齐如下图:

2.举例2

(1)

sizeof(test1)=sizeof(int)+4*sizeof(int)=4+4*4=20; (2)

分析:该结构体最大长度double型,长度是8,因此结构体长度分两部分:

第一部分是a、 b、 c的长度和,长度分别为1,4,8,则该部分长度和为13,取8的大于13的最小倍数为16;

第二部分为d,长度为1,取大于1的8的最小倍数为8,两部分和为24,故sizeof(test2)=24;

(3)

分析:该结构体有三个成员,其中第二个bb是类型为test2的结构体,长度为24,且该结构体最大长度成员类型为double型,以后成员中没有double型,所以按bb分界为两部分:

第一部分有a 、bb两部分,a长度为1,bb长度为24,取8的大于25的最小倍数32;

第二部分有cc,长度为4,去8的大于4的最小倍数为8;两部分之和为40,故sizeof(test3)=40;

(4)

求sizeof(test5)

分析:test5明显含有结构体test4,按例2容易知道sizeof(test4)=8,且其成员最大长度为4;则结构体test5的最大成员长度为8(double 型),考试.大提示e是分界点,分test5为两部分:

第一部分由c 、d、e组成,长度为1、8、8,故和为17,取8的大于17的最小倍数为24;

第二部分由f组成,长度为1,取8的大于1的最小倍数为8,

两部分和为32,故sizeof(test5)=24+8=32;

八、union

union的长度取决于其中的长度最大的那个成员变量的长度。即union中成员变量是重叠摆放的,其开始地址相同。其实union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点:

1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间;

2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除关系,该最大空间自动延伸;

我们来看看这段代码:

本来mm的空间应该是sizeof(int)*5=20;但是如果只是20个单元的话,那可以存几个double型(8位)呢?两个半?当然不可以,所以mm的空间延伸为既要大于20,又要满足其他成

员所需空间的整数倍,即24

所以union的存储空间先看它的成员中哪个占的空间最大,拿他与其他成员的元长度比较,如果可以整除就行。

九、指定对界

#pragma pack()命令

如何修改编译器的默认对齐值?

1.在VC IDE中,可以这样修改:[Project]|[Settings],c/c++选项卡Category的Code Generation选项的Struct Member Alignment中修改,默认是8字节。

2.在编码时,可以这样动态修改:#pragma pack .注意:是pragma而不是progma.

一般地,可以通过下面的方法来改变缺省的对界条件:

使用伪指令#pragma pack (n),编译器将按照n个字节对齐;使用伪指令#pragma pack (),取消自定义字节对齐方式。注意:如果#pragma pack (n)中指定的n大于结构体中最大成员size,则其不起作用,结构体仍然按照size最大的成员进行对界。

为了节省空间,我们可以在编码时通过#pragma pack()命令指定程序的对齐方式,括号中是对齐的字节数,若该命令括

号中的内容为空,则为默认对齐方式。例如,对于上面第一个结构体,如果通过该命令手动设置对齐字节数如下:

#pragma pack(2) //设置2字节对齐

#pragma pack() // 恢复先前的pack设置,取消设置的字节对齐方式

则,num从第6(偏移量)个字节开始存放,score从第10(偏移量)个字节开始存放,故sizeof(student)=12,其数据对齐如下图:

这样改变默认的字节对齐方式可以更充分地利用存储空间,但是这会降低计算机读写数据的速度,是一种以时间换取空间的方式。

十、代码验证

代码

输出

//这是默认的结果(8字节对齐)

//这是16字节对齐的结果,可以看到当设置16字节对齐时,确实没什么效果,里面最大的是double,也就是8字节,#pragma pack (n)中指定的n大于结构体中最大成员size,则其不起作用。

//这是2字节对齐的结果,可以慢慢参考研究

结构体和类的比较

结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。 1.结构的构造函数和类的构造函数不同。 2. a.结构不能包含显式的无参数构造函数。结构成员讲自动初始化为它们的默认值。 b.结构不能包含以下形式的初始值设定类:base(argument-list); 2.对于结构中的实例字段成员,不能在声明时赋值初始化。 3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。 4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。 5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。 结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。 class和struct有且仅有一个区别,那就是对于class说明的类成员,函数也好,变量也好,如果没有指定类型,缺省是private限定的。而对于struct,则是public的。 结构体数组效率比类数组效率高(不需要装箱合拆箱)。结构体集合(如Hashtable)效率比类集合效率低。集合的元素是引用类型,所以结构体必须进行装箱和拆箱处理。所以类在大的集合中更有效率。

C语言结构体习题及答案

第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】 A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 9、设有一结构体类型变量定义如下: struct date { int year; int month; int day; }; struct worklist { char name[20]; char sex; struct date birthday; } person; 若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。。。。

A. year=1976 B. birthday.year=1976 C. person.birthday.year=1976 D. person.year=1976 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连接出错

C语言题库第8章 结构体和共同体

第八章结构体和共同体 一、单项选择 1. 若有以下定义: struct link { int data; struct link *next; }a,b,c,*p,*q; 且变量a和b之间已有如下图所示的链表结构,若指针p指向a,指针q指向c。 则能把c插入到a和b之间形成新的链表的语句是( C ) 2. 若有以下程序段: int a=1,b=2,c=3; struct dent { int n ; int *m ; } s[3] = {{101,&a},{102,&b},{103,&c}}; struct dent *p=s ; 则以下表达式中值为2的是( D )。 3. 下面程序的运行结果是( D )。 #iunclude int main ( ) { struct complx { int x; int y ;

}cnum[2]={1,3,2,7} ; printf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x) ; return 0; } 二、程序设计 1. /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s 中,请编写函数fun, 它的功能是:按分数的高低排列学生的记录,高分在前。注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: */ #include #define N 16 typedef struct { char num[10]; int s ; }STREC; void fun (STREC a[]) { /*********Begin*********/ /*********End**********/ } int main () { FILE *wf,*in; STREC s[N]={{ "GA005",85},{"GA003",76},{"GA002",69},{"GA004",85}, {"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87}, {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91}, {"GA011",66},{"GA017",64},{"GA018",64},{"GA016",72}}; int i; fun(s); printf("The data after sorted :\n"); for (i=0; i

C语言结构体和共用体实验报告

实验九参考程序 实验 9- 1 /**************************************************************** * 实验 9.1 * * ( 1 )为某商店的商品设计合适的结构体 (PRODUCT) 。每一种商品包含编号 (number) 、 * 名称 (name) 、价格 (price) 、折扣 (discount)4 项信息,根据表 9-1 ,为这些信 息选择合适的数据类型。 * (2)建立 2个函数,以实现对商品的操作。 input 函数实现商品的输入; * display 函数显示商品信息。要求这 2个函数都以商品的结构体 (PRODUCT) 指针为 参数。 * (3 )在主函数中为商品键盘定义一个结构体变量 (keyboard) ,利用 input 函数实现键 盘信息的输入; * 定义一个结构体数组 (elec_device[3]) ,利用 input 函数实现冰箱、 空调、电视 信息的输入; * 最后利用 display 函数显示 4 种商品的信息。 * * 表 9-1 #include typedef struct _PRODUCT int iNumber; char strName[32]; float fPrice; float fDiscount; * 编号 名称 价格 折扣 *1010 键盘 89.50 0.85 *1021 冰箱 1024.00 0.95 *1022 空调 2058.50 0.90 *1023 电视 3001.88 0.95 *************************************************************** */

类和结构体的区别

类和结构体的区别 1. class和structure很相似,从技术层面讲,class是引用,而 structure则是数值.有人很形象的说 class里有行动,方法,成员,是有机体的结合,而structure则是活生生的有机体, 2. 通俗的理解,class包涵structure, class里有方法拉,成员 拉,什么滴, 而structure只有数据, 二 .类与结构的差别 %%%类成员默认是private,而结构体默认是 public。 1.值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对 应 system.string 结构,通过使用结构可以创建更多的值类 型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象 (object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分 配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其

类与结构体的区别

类与结构体的区别 区别有三: 1: 类可以继承,结构不可以. 2: 类是引用类型,结构是值类型 3: 类在堆中,结构在栈分配内存 二 .类与结构的差别 1.值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复 杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间 的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类 型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对 象不可用 2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也 能被继承 注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样 例如:结构实现接口 interface IImage

{ void Paint(); } struct Picture : IImage { public void Paint() { // painting code goes here } private int x, y, z; // other struct members } 3.内部结构: 结构: 没有默认的构造函数,但是可以添加构造函数 没有析构函数 没有abstract和sealed(因为不能继承) 不能有protected修饰符 可以不使用new初始化 在结构中初始化实例字段是错误的 类: 有默认的构造函数 有析构函数 可以使用abstract和sealed 有protected修饰符 必须使用new初始化

c语言结构体与共用体之间的区别

https://www.doczj.com/doc/223349235.html,/2005/03/25/12365.html 所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为: union 共用体名 {成员表列}; 7.5.1 共用体的定义 union data { int a ; float b ; d o u b l e c ; c h a r d ; } obj; 该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。共用体 数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。 [例7 - 8 ] union data /*共用体* / { int a; float b; double c; char d; } m m ; struct stud /*结构体* / { int a; float b; double c; char d; } ; m a i n ( ) { struct stud student printf("%d,%d",sizeof(struct stud),sizeof(union data)); } 程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的

共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7 - 6所示。 对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存 空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。 7.5.2 共用体变量的引用 可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为: union data /*共用体* / { int a; float b; double c; char d; } m m ; 其成员引用为:m m . a , m m . b , m m . c , m m . d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。 [例7-9] 对共用体变量的使用。 m a i n ( ) { union data { int a; float b; double c; char d; } m m ; m m . a = 6 ; printf("%d\n",mm.a); m m . c = 6 7 . 2 ; p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ; m m . d = ' W ' ; m m . b = 3 4 . 2 ; p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ; }

类与结构体的区别

区别有三: 1: 类可以继承,结构不可以. 2: 类是引用类型,结构是值类型 3: 类在堆中,结构在栈分配内存 二 .类与结构的差别 1.值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的 sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承 注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样 例如:结构实现接口 interface IImage { void Paint(); } struct Picture : IImage { public void Paint() { // painting code goes here } private int x, y, z; // other struct members }

c#中结构体和类的比较

c#中结构体和类的比较 区别: 结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。 1.结构的构造函数和类的构造函数不同。 a.结构不能包含显式的无参数构造函数。结构成员讲自动初始化为它们的默认值。 b.结构不能包含以下形式的初始值设定类:base(argument-list); 2.对于结构中的实例字段成员,不能在声明时赋值初始化。 3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。 4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。 5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。 最后引用博客园的“越过林子”的话: 结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。 C#中结构与类的区别 作者:未知时间:2004-10-20 12:12 出处:互联网责编:jizhuwo 摘要:暂无 本文目录 类与结构的实例比较 类与结构的差别

第9章结构体类型与共用体类型习题及答案

第九章结构体类型与公用体类型习题及其答案9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 解:#include "stdio.h" struct date { char month[10] ; int daynumber ; } main() { int i ; date a[12] ={{"January",31},{"February",29},{"March",31},{"Aprial",30}, {"May",31},{"June",30},{"july",31},{"August",31},{"September",30} ,{"October",31},{"November",30},{"December",31}} ; for(i=0;i<12;i++); printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ; } 思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用? 9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。 解:#include "stdio.h" #include "math.h" struct point { float x ; float y ; float z ; } void main() { double d1,d2,d ;

point p1,p2 ; printf("请输入第一个点的坐标:"); scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z); printf("请输入第二个点的坐标:"); scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z); d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z); d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z); d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*( p2.z-p1.z)); printf("第一个点到原点的距离:%f\n",d1); printf("第二个点到原点的距离:%f\n",d2); printf("两点间的距离:%f\n",d); } 9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。 解:#include "stdio.h" struct AddressBook { char name[10] ; char address[30] ; char mailnumber[7] ; char telphone[12] ; char byphone[16] ; char movephone[1] ; } void main() { int i ; AddressBook fd[10] ; for(i=0;i<10;i++) { printf("请输入第%d个朋友的信息:\n",i+1); printf("姓名:");

2017年计算机二级C语言的结构体和共用体考试考点

2017年计算机二级C语言的结构体和共 用体考试考点 更多计算机软件水平考试相关信息请访问计算机软件水平考试网。 【考点1】结构体类型的说明 结构体是若干个类型数据的集合, 结构体类型说明格式: struct 类型名{类型1 成员名1;类型2 成员名2;……};,以上整个部分是一个数据类型,与整型的int是同样地位。可用typedef把结构体类型替换成一个只有几个字母的简短标识符。 【考点2】结构体变量的定义 结构体变量是用说明的结构体类型所定义的一个变量,与结构体类型不是一回事。一个结构体变量所占字节数为其所有成员所占字节数之和。如struct stu{char name[10];int age;} a,b;则表明定义了两个结构体变量a,b,每个变量占14个字节。a,b与int i,j;中的变量i,j 是同样地位。typedef 考的很多(教材150页例6)。 【考点3】结构体成员的引用 引用成员可用以下3种方式:(1)结构体变量名.成员名;(2)

指针变量名->成员名:(3)(*指针变量名).成员名。点(.)称为成员运算符,箭头(->)称为结构指向运算符。 【考点4】共用体 共用体的使用格式与结构体相似,共用体定义的关键字为union,共用体所占字节数是所有成员中字节数的那个。 union TT { int a; char ch[2];} t1 ; main() {t1.a=0x1234; printf("%x\n",t1.ch[0] ); printf("%x\n",t1.ch[1] );} 考点一:sizeof (struct TT) = 2; 考点二:TT t1 ; t1.a=0x1234; 那么ch[0]=0x 34; ch[1]=0x12 结构体和共用体以及链表要掌握最简单的。typedef 考的很多,而且一定要知道如何引用结构体中的各个变量,链表中如何填加和删除节点,以及何如构成一个简单的链表,一定记住链表中的节点是有两个域,一个放数值,一个放指针。 【考点5】链表 链表是由一个个结点构成的,一个结点就是一个结构体变量。每个结点可以分为数据域与指针域两个部分,数据域用来存放要存储的

C语言习题 结构体和杂类(答案)

第十章结构体和杂类 一. 选择题 1. 如下说明语句,则下面叙述不正确的是(C)。 struct stu { int a ; float b ;} stutype; A.struct是结构体类型的关键字 B.struct stu是用户定义结构体 类型 C. stutype是用户定义的结构体类型名(变量名) D. a和b都是结 构体成员名 2. 在16位PC机中,若有定义:struct data { int i ; char ch; double f; } b ; 则结构变量b占用内存的字节数是(D)。 A.1 B.2 C.8 D.11 3. 设有定义语句:enum t1 {a1, a2 = 7, a3, a4 = 15} time;则枚举 常量a2和a3的值分别为(D)。 A. 1和2 B. 2和3 C. 7和2 D. 7和8 4. 以下程序的输出结果是( D )。 union myun { struct { int x, y, z; } u; int k; } a; main( ) { a.u.x=4; a.u.y=5; a.u.z=6; a.k=0; printf(" %d\n",a.u.x); } A. 4 B. 5 C. 6 D. 0 5. 当定义一个共用体变量时,系统分配给它的内存是( C )。 A.各成员所需内存量的总和 B.结构中第一个成员所需内存 量 C.成员中占内存量最大的容量 D.结构中最后一个成员所需内 存量 6. 若有以下程序段: union data { int i ; char c; float f;} a; int n; 则以下语句正确的是( C )。 A.a=5; B.a={2,’a’,1.2} C.printf(“%d”,a); D.n=a; 7. 设struct {int a; char b; } Q, *p=&Q;错误的表达式是( d )。 A.Q.a B.(*p).b C.p->a D.*p.b 9. 以下对C语言中共用体类型数据的叙述正确的是( c )。 A. 可以对共用体变量直接赋值 B.一个共用体变量中可以同时存放其所有成员 C.一个共用体变量中不能同时存放其所有成员 D.共用体类型定义中不能出现结构体类型的成员

C语言结构体和共用体实验报告

实验九参考程序 实验9-1 /**************************************************************** *实验9.1 * *(1)为某商店的商品设计合适的结构体 (PRODUCT)。每一种商品包含编号(number)、 * 名称(name)、价格(price)、折扣(discount)4项信息,根据表9-1,为这些信息选择合适的数据类型。 *(2)建立2个函数,以实现对商品的操作。input函数实现商品的输入; * display函数显示商品信息。要求这2个函数都以商品的结构体(PRODUCT)指针为参数。 *(3)在主函数中为商品键盘定义一个结构体变量(keyboard),利用input函数实现键盘信息的输入; * 定义一个结构体数组(elec_device[3]),利用input函数实现冰箱、空调、电视信息的输入; * 最后利用display函数显示4种商品的信息。 * * 表9-1 * *编号名称价格折扣 *1010 键盘89.50 0.85 *1021 冰箱1024.00 0.95 *1022 空调2058.50 0.90 *1023 电视3001.88 0.95 * ****************************************************************/ #include typedef struct _PRODUCT { int iNumber; char strName[32]; float fPrice; float fDiscount; }PRODUCT,*PPRODUCT; void input(PRODUCT *pProduct); void display(PPRODUCT pProduct); void main() { int i; PRODUCT kyeboard;

C语言结构体与共用体过关题

班级 考号 姓名_________________试场号______________座位号______________ 装订线内不要答题 ◆◆◆◆◆◆◆◆◆◆装◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆订◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆线◆◆◆◆◆◆◆ 沅江市职业中专计算机专业《C 语言》试卷 结构体与共用体过关题 考生注意:本试卷共5大题,总分150 分,考试时间 90 分钟。 一、程序写结果题:本题共6题,每题5分,共30分。 1. 下面程序的输出是_______。 main() { enum em{em1=3,em2=1,em3}x ; char *aa[]={"AA","BB","CC","DD"}; x=em2; printf("%s%s%s\n",aa[em1],aa[x],aa[em3]);} 2. 下面程序的输出结果是________。 struct ks { int a; int *b;}; main() { struct ks s[5],*p; int n=1,i; for(i=0;i<5;i++) { s[i].a=n; s[i].b=&s[i].a; n=n+3; } p=&s[1]; printf("%d,%d\n",++(*p->b),*(s+2)->b);} 3.下面程序的输出是 Struct ab{int a[2];char b;float c;}; typedef union { long x[2]; int y[7]; char z[8]; struct ab b[4]; } MY; main() { MY them[10]; printf("%d\n",sizeof(them));} 4. 字符ˊ0ˊ的ASCII 码的十进制数为48,且数组的第0个元素在低位,则 以下程序的输出结果是 。 main() { union { int b[4]; long k ;char c[4];} a,*s=&a ; s->b[0]=0x3738; s->b[1]=0x3635; printf(〞%c\n 〞,s->c[1]);} 5.有以下程序输出结果是 struct stu {int num;char name[10];int age; }; void fun(struct stu *p) { p++; p->age=45; strcpy(p->name,”liming ”); } main() {struct stu ss[3]={{01,"zhang",20},{02,"Wang",19},{03,"zhao",18}}; fun(ss+1); printf(“%d,%s,%d\n ”,ss[2].num,ss[2].name,ss[2].age);} 6.设位段的空间分配由右到左,则以下程序的运行结果是 。 struct as { unsigned a : 2 ; unsigned b : 3 ; unsigned c : 4 ; } data ; main ( ) { unsigned char x=45; data.a=7 ; data.b=2 ; data.c=23; data.i=68; data.a=data.a&x; data.c=data.b^x; printf(“%d\n ”,data.a+data.b+data.c) ; } 二、程序填空题:本题共3题,每题10分,共30分。

计算机二级C语言结构体要点

结构体与共用体要点 一、概述 结构体(structure)是一种数据类型,它把互相联系的数据组合成一个整体。 把不同类型的数据组合成一个有机的整体,可以用结构体解决。 结构体中的每一项数据,称为结构体“成员”(member)或“分量”。 声明结构体类型的一般形式:struct 结构体名 {成员表列}; 声明各成员的形式:类型名成员名; 例如:学生数据struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; }; 注意不要忽略最后的分号 student结构体类型占59个字节。 二、定义结构体类型变量的方法 1.先声明结构体类型再定义变量名 struct student student1, student2;要求指定为某一特定的结构体类型2.在声明类型的同时定义变量 struct 结构体名 {成员表列 }变量名表列; 例如:struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; } student1, student2; 3.直接定义结构体类型变量 struct {成员表列 }变量名表列; 几点说明: (1)类型与变量是不同的概念; (2)结构体中的成员可单独使用,其作用与地位相当于普通变量; (3)成员也可以是一个结构体变量; (4)成员名与普通变量名相同,不代表同一对象。 三、结构体变量的引用 (1)不能将结构体变量整体进行输入和输出,只能对各个成员分别进行输入和输出。 printf("%d,%s,%c,%d,%f,%s\n",student1);错误 (2)引用成员的方式:结构体变量名.成员名

C语言结构体习题及答案

C语言结构体习题及答 案 SANY GROUP system office room 【SANYUA16H-

第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 9、设有一结构体类型变量定义如下: struct date { int year; int month;

int day; }; struct worklist { char name[20]; char sex; struct date birthday; } person; 若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。。。。 A. year=1976 B. birthday.year=1976 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行 C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连接出错

相关主题
文本预览
相关文档 最新文档