C语⾔结构体(struct)最全的讲解(万字⼲货)
结构体的定义
结构体(struct)是由⼀系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
结构体和其他类型基础数据类型⼀样,例如int类型,char类型只不过结构体可以做成你想要的数据类型。以⽅便⽇后的使⽤。
在实际项⽬中,结构体是⼤量存在的。研发⼈员常使⽤结构体来封装⼀些属性来组成新的类型。由于C语⾔⽆法操作数据库,所以在项⽬中通过对结构体内部变量的操作将⼤量的数据存储在内存中,以完成对数据的存储和操作。
在实际问题中有时候我们需要⼏种数据类型⼀起来修饰某个变量。
例如⼀个学⽣的信息就需要学号(字符串),姓名(字符串),年龄(整形)等等。
这些数据类型都不同但是他们⼜是表⽰⼀个整体,要存在联系,那么我们就需要⼀个新的数据类型。
——结构体,它就将不同类型的数据存放在⼀起,作为⼀个整体进⾏处理。
数组全部赋值为1结构体在函数中的作⽤不是简便,其最主要的作⽤就是封装。封装的好处就是可以再次利⽤。让使⽤者不必关⼼这个是什么,只要根据定义使⽤就可以了。
结构体的⼤⼩不是结构体元素单纯相加就⾏的,因为我们现在主流的计算机使⽤的都是32Bit字长的CPU,对这类型的CPU取4个字节的数要⽐取⼀个字节要⾼效,也更⽅便。所以在结构体中每个成员的⾸地址都是4的整数倍的话,取数据元素时就会相对更⾼效,这就是内存对齐的由来。每个特定平台上的编译器都有⾃⼰的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令
#pragmapack(n),n=1,2,4,8,16来改变这⼀系数,其中的n就是你要指定的“对齐系数”。
规则
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第⼀个数据成员放在offset为0的地⽅,以后每个数据成员的对齐按照#pragmapack指定的数值和这个数据成员⾃⾝长度中,⽐较⼩的那个进⾏。
2、结构(或联合)的整体对齐规则:在数据成员完成各⾃对齐之后,结构(或联合)本⾝也要进⾏对齐,对齐将按照#pragmapack指定的数值和结构(或联合)最⼤数据成员长度中,⽐较⼩的那个进⾏。
3、结合1、2可推断:当#pragmapack的n值等于或超过所有数据成员长度的时候,这个n值的⼤⼩将
不产⽣任何效果。
在C语⾔中,可以定义结构体类型,将多个相关的变量包装成为⼀个整体使⽤。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在C语⾔中,结构体不能包含函数。在⾯向对象的程序设计中,对象具有状态(属性)和⾏为,状态保存在成员变量中,⾏为通过成员⽅法(函数)来实现。C语⾔中的结构体只能描述⼀个对象的状态,不能描述⼀个对象的⾏为。在C++中,考虑到C语⾔到C++语⾔过渡的连续性,对结构体进⾏了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,⽽不是private。
结构体声明
//声明⼀个结构体
struct book
{
char title[MAXTITL];//⼀个字符串表⽰的titile 题⽬;
char author[MAXAUTL];//⼀个字符串表⽰的author作者;
float value;//⼀个浮点型表⽰的value价格;
};//注意分号不能少,这也相当于⼀条语句;
这个声明描述了⼀个由两个字符数组和⼀个float变量组成的结构体。
但是注意,它并没有创建⼀个实际的数据对象,⽽是描述了⼀个组成这类对象的元素。
因此,我们有时候也将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象。
下⾯介绍⼀下上⾯的结构体声明;
1、⾸先使⽤关键字struct,它表⽰接下来是⼀个结构体。
2、后⾯是⼀个可选的标志(book),它是⽤来引⽤该结构体的快速标记。
因此我们以后就可以这样创建数据对象
struct book library;//把library设为⼀个可以使⽤book结构体的结构体变量,则library这个变量就包含了其book结构体中的所有元素3、接下来就是⼀个花括号,括起了结构体成员列表,及每个成员变量,使⽤的都是其⾃⼰的声明⽅式来描述,⽤分号来结束描述;
例如:char title[MAXTITL];字符数组就是这样声明的,⽤分号结束;
注意:其中每个成员可以使⽤任何⼀种C数据结构甚⾄是其他的结构体,也是可以的;
4、在结束花括号后的分号表⽰结构体设计定义的结束。
关于其struct声明的位置,也就是这段代码要放到哪⾥。同样这也是具有作⽤域的。
这种声明如果放在任何函数的外⾯,那么则可选标记可以在本⽂件中,该声明的后⾯的所有函数都可以使⽤。如果这种声明在某个函数的内部,则它的标记只能在内部使⽤,并且在其声明之后;
关于我们不断说的,标记名是可选的,那么我们什么时候可以省略,什么时候⼀定不能省略呢?
如果是上⾯那种声明定义的⽅法,并且想在⼀个地⽅定义结构体设计,⽽在其他地⽅定义实际的结构体变量,那么就必须使⽤标记;可以省略,设计的同时就创建该结构体变量,但是这种设计是⼀次性的。
⼀般格式就是:
struct 结构体名(也就是可选标记名){ 成员变量;};//使⽤分号表⽰定义结束。
C语⾔结构体定义的三种⽅式
1、最标准的⽅式:
#include <stdio.h>
struct student //结构体类型的说明与定义分开。声明
{
int age; /*年龄*/
float score; /*分数*/
char sex; /*性别*/
};
int main ()
{
struct student a={ 20,79,'f'}; //定义
printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex ); return 0;
2、不环保的⽅式
#include <stdio.h>
struct student /*声明时直接定义*/
{
int age; /*年龄*/
float score; /*分数*/
char sex; /*性别*/
/*这种⽅式不环保,只能⽤⼀次*/
} a={21,80,'n'};
int main ()
{
printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
3、最奈何⼈的⽅式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论