经验技巧8-1 结构体变量的存储长度

经验技巧8-1 结构体变量的存储长度
经验技巧8-1 结构体变量的存储长度

经验技巧8-1 结构体变量的存储长度

结构体变量的存储长度,跟编译器字节对齐密切相关。为了使CPU对变量进行快速高效的访问,变量的起始地址应该满足某些特性,即所谓的对齐。关于字节对齐有两个重要的宏:#pragma pack (n)和#pragma pack。

(1)#pragma pack (n):一般情况下,此宏的作用在于强制编译器以n的倍数进行地址对齐。

(2)#pragma pack:结束前面设置的对齐方式,恢复到编译器默认的对齐方式。

Visual C++默认的字节对齐数为8。

结构体变量中的成员item在结构体中相对于首地址的偏移量应该是X的倍数,X由如下式决定:

X=min(n,sizeof(item)),(item是占字节最大的类型的成员)

【示例1】假设n为8,若有如下定义

struct Test { char c1; char c2; int i;};

struct Test t;

那么在存储结构体变量t的成员i时,X就应该是min(8,sizeof(int))=4的倍数,即i相对于结构体变量首地址的偏移量必须是4的倍数,所以t的大小就应该为8=(2+2+4)字节(在c1和c2后填充了两个字节以满足前述条件)。

而对于struct { char c1; char c2} t;则不会出现填充的的情况,每个成员相对首地址的偏移量也满足是X的倍数(此时X为1),变量t的大小为2字节。

【示例2】若有结构体变量:struct {char c1; double d;} t;,默认情况下结构体变量t占用16=(8+8)字节(在c1后填充7个字节以满足字节对齐)。如果强制编译器以4字节对齐,即在声明这种结构体变量前有宏定义#pragma pack (4),此时X为4,则此种类型结构体变量占用的内存为12=(4+8)字节。

还有一种特殊情况,就是空结构体。在Visual C++下其大小为1,即struct{}类型的变量在VC下输出其大小是1,原因就是VC为每个结构体变量分配一个字节的内存,以使该变量有个地址;而在gcc下输出其大小为0。

最后,结构体成员中有结构体变量的情况见下例:

【示例3】若有struct test1 { char c1; int i ; char c2 ;}t1;则X=4,所以t1占用4+4+4=12个字节,那么对于struct test2 { int i; struct test1 t1; char c2; }t2;有X=min{8,max(4,4,1)}=4,所以t2占用4+12+4=20个字节,在确定上述的X时会把t1拆散成基本数据类型来处理,而计算结构体变量t2的大小时又会把t1作为一个整体来对待。故默认情况下,结构体test2类型变量的大小为:20字节。

c语言结构体用法(转载)

C语言,结构体(struct) 用法 结构(struct) 结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。 结构中可以使用不同的数据类型。 1. 结构说明和结构变量定义 在T urbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此, 象其它 类型的变量一样, 在使用结构变量时要先对其定义。 定义结构变量的一般格式为: struct 结构名 { 类型变量名; 类型变量名; ... } 结构变量; 结构名是结构的标识符不是变量名。 类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和 无值型)。 构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中 元素是以下标来访问的, 而结构是按变量名字来访问成员的。

下面举一个例子来说明怎样定义结构变量。 struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; } person; 这个例子定义了一个结构名为string的结构变量person, 如果省略变量名 person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义 时上例变成: struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; }; struct string person; 如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作 结构说明, 再用结构名来定义变量。 例如: struct string T ianyr, Liuqi, ...; 如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这 种结构时前面的例子变成:

结构体的定义及初始化

?结构体类型定义 struct [结构体名] { 类型标识符成员名; 类型标识符成员名; ……………. };成员类型可以是基本型或构造型 struct是关键字,不能省略合法标识符 可省:无名结构体 结构体的说明及结构体变量的定义

例struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; name num sex age score addr 2字节 2字节 20字节 1字节 4字节 30字节 … ….. 结构体类型定义描述结构 的组织形式,不分配内存 例子图解

?结构体类型定义 struct [结构体名] { 类型标识符成员名; 类型标识符成员名; ……………. };成员类型可以是基本型或构造型 struct是关键字,不能省略合法标识符 可省:无名结构体 结构体的说明及结构体变量的定义

(1) 在结构体说明的同时定义结构体变量,例如:struct example { char *name; int age; }guo,zhang;(2)直接定义结构体变量,例如: struct {char *name; int age; }guo,zhang 未给 出结 构体 名 (3) 把定义和说明分开,例如:struct example { char *name; int age; }; struct example guo,zhang;结构体变量占用内存的大小可用sizeof()运算来求出 ?结构体变量的定义

结构体的说明及结构体变量的定义?变量说明形式 struct 结构体名结构体变量名; ?注意: 结构变量的存储类型概念、它的寿命、可见 性及使用范围与普通变量、数组等完全一致。 结构体变量说明必须在结构类型定义之后, 二者也可同时进行。

【c语言程序设计】结构体

第一章CH9 结构体9.1 选择题 1.若有以下说明语句: struct student { int num; char name[ ]; float score; }stu; 则下面的叙述不正确的是: ( D ) A. struct是结构体类型的关键字 B. struct student 是用户定义的结构体类型 C. num, score都是结构体成员名 D. stu是用户定义的结构体类型名 2.若有以下说明语句: struct date { int year; int month; int day; }brithday; 则下面的叙述不正确的是__C___. A) struct是声明结构体类型时用的关键字 B) struct date 是用户定义的结构体类型名 C) brithday是用户定义的结构体类型名 D) year,day 都是结构体成员名 3.以下对结构变量stul中成员age的非法引用是B struct student { int age; int num; }stu1,*p; p=&stu1; A) stu1.age B) student.age C) p->age D) (*p).age 4.设有以下说明语句: typedef struct stu { int a; float b; } stutype; 则下面叙述中错误的是(D)。 A、struct是结构类型的关键字

B、struct stu是用户定义的结构类型 C、a和b都是结构成员名 D、stutype是用户定义的结构体变量名 5.设有以下定义,值为5的枚举常量是()。 enum week{sun,mon=4,tue,wed,thu,fri,sat} w; A tue B sat C fri D thu 6.设有如下定义: struct sk {int a;float b;}data,*p; 若有p=&data;,则对data中的a域的正确引用是(B)。 A)(*p).data.a B)(*p).a C)p->data.a D)p.data.a 7.根据以下定义,能输出字母M的语句是(D)。 A、printf(“%c\n”,class[3].name) B、printf(“%c\n”,class[3].name[1]); C、printf(“%c\n”,class[2].name[1]) D、printf(“%c\n”,class[2].name[0]); struct person{char name[9];int age;}; struct person class[10]={“John”,17,”Paul”,19,”Mary”,18,”Adam”,16,}; 8.以下程序的输出结果是(D)。 A、0 B、1 C、3 D、6 #include void main() { struct emplx{int x;int y;}enum[2]={1,3,2,7}; printf(“%d\n”,enum[0].y/enum[0].x*enum[1].x); } 9.若有以下说明及语句,则值为6的表达式是(D)。 A、p++->n B、p->n++ C、(*p).n++ D、++p->n struct st{int n;struct st *next;}; struct st a[3],*p; a[0].n=5;a[0].next=&a[1];a[1].n=7;a[1].next=&a[2]; a[2].n=9;a[2].next=’\0’;p=&a[0]; 10.已知字符0的ASCII码的十进制的值是48,且数组的第0个元素在低位,以下程序的输出结果是(B)。 A、39 B、9 C、38 D、8 void main() {

结构体变量初始

结构体变量初始

————————————————————————————————作者:————————————————————————————————日期:

9.1.6 结构体变量的初始化 和C语言中其它变量一样,在定义结构体变量时可以进行初始化操作,一般形式为([]中的内容表示可省略): struct [结构体类型名] { 数据类型名1 成员名1; …… 数据类型名n 成员名n; }结构体变量 = {初始数据}; 例如,可以在定义hero型变量wusong时对其进行初始化: struct hero { int number; //排名 char sex; //性别 char star_name[20]; //星名 char name[20]; //名称 char nickname[20]; //绰号 char position[20]; //职业 char weapon[20]; //使用武器 } wusong={14,’m’,”天伤星”,”武松”,”行者”,”步兵头领”,”2把戒刀”}; //定义了结构体变量wusong并初始化。

定义结构体变量wusong但没有初始化时,编译器会给每个成员一个默认值,初始化后就赋予初始化时地赋值,如图9.4所示: 图9.4 结构体变量及其初始化 注意:对结构体变量进行初始化时,必须按照每个成员的顺序和类型一一对应地赋值,少赋值、多赋值,以及类型不符都可能引起编程错误。 9.1.6 结构体变量的引用 在定义了结构体变量后,就可以引用这个变量。所谓引用结构体变量就是使用结构体变量或结构体变量的成员进行运算或者其他操作。 1. “.”运算符 在C语言中,“.”也是一个运算符,叫做成员运算符。一般和结构体或共用体变量名称一起使用,用来指定结构体或共用体变量的成员。例如: linchong.nickname; 用来指定结构体变量linchong的成员nickname。 2. 结构体变量成员的引用 C语言允许引用结构体变量的成员完成某种操作。其一般形式为:

实验6 结构体的应用

实验6 结构体的应用 实验目的 1.掌握结构体类型及结构体变量的定义和使用。 2.掌握结构体类型数据在函数中的应用。 3.掌握结构体数组的使用。 实验内容 1.下列程序完成对一名职工的姓名、出生年月、基本工资的初始化。从键盘输入奖金金额,输出对应职工的姓名、年龄、基本工资和应领金额等信息。阅读、写出并分析运行结果。 #include using namespace std; struct Date { int year,month; }; struct Person { char name[20]; Date birth; float money,salary; // money 为基本工资;salary为应领金额 }; int main() { Person p={"张三",{1982,3},1250,0}; float num; cout<<"请输入"<< https://www.360docs.net/doc/2916642731.html,<<"的奖金金额:"; cin>>num; p.salary=p.money+num; cout<

对结构体成员进行赋值操作

#include using namespace std; struct student { int id; char name[10]; char zhuanye[20]; }; void main() { student stu; cout<<"请输入学生信息:"<>stu.id; cout<<"姓名:"; cin>>https://www.360docs.net/doc/2916642731.html, ; cout<<"专业:"; cin>>stu.zhuanye; cout<

结构体数据类型*变量[=&结构体变量] struct student { int id; char name[10]; char zhuanye[20]; }stu; stu a;*p=&a; p为结构体指,指向结构体变量针变量a。&a为结构体变量的指针。 3、结构体指针变量对结构体变量成员的引用 格式如下: 结构体指针变量->所指向的结构体变量的成员 或者: (*结构体指针变量). 所指向的结构体变量的成员 例如: Struct { char ch[2]; int x }a,*p=&a; p->ch[0]; p->ch[1]; p->x; 或者 (*p).ch[0]; (*p).ch[1]; (*p).x;

C语言结构体struct用法

C语言,结构体(struct) 用法 在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。它相当于其它高级语言中的记录。 “结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样 1. 结构说明和结构变量定义 在使用结构变量时要先对其定义。 1> struct 结构名 { 类型成员名; 类型成员名; ... } ; 2> struct 结构名 { 类型成员名; 类型成员名; ... } 结构变量名; 3>. struct 结构名 { 类型成员名; 类型成员名; ... } ; Struct 结构名结构变量名; 4> struct 结构名 { 类型成员名; 类型成员名; struct 结构名 { 类型成员名; 类型成员名; ... } 结构变量名; ... } 结构变量名; //可以是1>类型的,也可以是2>类型的嵌套

5> struct { 类型成员名; 类型成员名; ... } 结构变量名; //这种无结构名的,常常出现在函数内部,此时,结构变量名必须与结构一起方可。 结构变量名表既可以是变量,也可以是数组。可以直接对变量名表赋值,赋值时,一个变量用一个大括号表示,变量成员括在大括号之内,各变量名间用逗号隔开。 查看变量名下的成员内容,就相当于一个二维的变量,具体格式为:结构变量名+ 点+成员名,给单个成员名赋值也一样。 用指针应用结构体变量中的各成员。形式为: 结构指针名->成员名相当于(*结构指针名). 成员名//圆括号不能省 也相当于结构变量名 . 成员名 例如: Struct student *p=&stu; //stu为结构变量名 或者:Struct student *p; p=stu; 类型为五种数据类型(整型、浮点型、字符型、指针型和无值型)。 下面举一个例子来说明怎样定义结构变量。 struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; } person; 这个例子定义了一个结构名为string的结构变量person, 如果省略变量名 person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义 时上例变成: struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; }; struct string person; 如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作结构说明, 再用结构名来定义变量。当只有结构说明时,也可以在函数应用时再利用结构名定义变量。 例如: struct string Tianyr, Liuqi, ...;

C语言1-结构体类型概述、结构体类型变量

章节名称结构体类型概述、结构体类型变量 授课类型□理论□实验?理实一体□实训□实习 班级地点周次星期节次授课进度 ?符合□超前□滞后 ?符合□超前□滞后 ?符合□超前□滞后 教学目标知识目标 1.掌握结构体类型的声明方法 2.掌握结构体类型变量的定义、初始化和引用方法能力目标能根据实际需要声明结构体类型 教学重点1.结构体类型的声明方法 2.结构体类型变量的定义、初始化和引用方法 教学难点结构体类型的声明、结构体变量的引用教学方法讲授法、对比法、启发法、练习法 教学手段多媒体、机房电脑、板书 教学资源教材、教学PPT、微课视频、课程网站 教学设计 教学环节内容要点教学方法 与手段 时间 分配 导入 前面已经学习了基本类型(整型、实型、字符型)和一种构造类型——数 组,数组是将相同类型的多个数据组合在一起。在实际问题中,一组数据往 往具有不同的数据类型。例如,在学生成绩表中,一个学生的学号为整型、 姓名为字符型、成绩为实型,显然不能用一个数组将某个学生的这些数据组 合在一起。为解决这一问题,用户可以建立由不同类型数据组成的组合型数 据结构——结构体。 5 新课教学一、结构体类型的声明:关键字struct、结构体名、成员名讲授法10 二、结构体类型变量 1、定义结构体变量的方法 (1)先声明结构体类型,再定义结构体变量 (2)在声明结构体类型的同时定义结构体变量 (3)不指定结构体名而直接定义结构体变量 2、说明:(1)结构体成员也可以是一个结构体变量 (2)结构体成员名可与程序中其他变量同名 讲授法、 对比法 30 二、结构体变量的初始化和引用 1、结构体变量的初始化 2、结构体变量成员的引用:结构体变量名.成员名 【例6.1】 讲授法、 练习法 30 3、结构体变量的说明:(1)结构体变量成员的运算 (2)结构体变量地址和成员地址的引用 讲授法10 课堂小结结构体类型声明的方法,结构体变量的定义、初始化及引用方法 3 作业布置复习本次课内容;预习6.3节“结构体类型数组” 2 7S管理整理、整顿、清扫、清洁、素养、节约、安全课后 教学效果及改进思路

C语言基础-结构体和联合体

C语言基础-结构体和联合体 在C中, 结构也是一种数据类型, 可以使用结构变量, 因此, 象其它类型的变量一样, 在使用结构变量时要先对其定义。 定义结构变量的一般格式为: struct 结构名 { 类型变量名; 类型变量名; ... } 结构变量; 结构名是结构的标识符不是变量名。 类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和无值型)。 构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中元素是以下标来访问的, 而结构是按变量名字来访问成员的。 下面举一个例子来说明怎样定义结构变量。 struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; } person; 这个例子定义了一个结构名为string的结构变量person, 如果省略变量名person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义时上例变成: struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; }; struct string person; 如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作结构说明, 再用结构名来定义变量。 例如: struct string Tianyr, Liuqi, ...; 如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这种结构时前面的例子变成: struct {

相关主题
相关文档
最新文档