c语言结构体中example,C语言结构体的学习与使用

C语言结构体的学习与使用

结构体定义与使用

结构体是C语言中的明显的构造类型,相对于只能存储相同类型元素的数组,结构体是存放不同类型数据的集合。结构体一般会在处理数据信息时使用。

构造结构体定义,类型为 struct Person

struct Person

{

int number;

char sex;

double money;

};

上述形式只是定义了一个类型,类型中有 number、sex、money这些内容。

结构体的使用,使用结构体类型定义变量

struct Person p1;

// 注意 struct Person 是一个完整的类型, p1 才是结构体变量。

如果要访问结构体成员,需要使用成员访问运算符.

p1.number = 1;

p1.sex = 'f';

p1.money = 62.5;

printf("%d %c %lf", p1.number, p1.sex, p1.money);

以上是赋值的操作,但是如果加上 const 则只能通过初始化的方式进行赋值。

const struct Person example_person = {1, 'f', 62.5};

在结构体成员初始化中,可以按照类型的格式给部分成员进行初始化,但是会按照定义的先后顺序进行匹配,而不是按照类型进行匹配。

也可以通过传参的方式进行处理

void print_person(struct Person p)

{

printf("%d %c %lf", p.number, p.sex, p.money);

}

print_person(example_person);

也可以定义结构体数组,用于存放创建的结构体,然后通过数组的遍历进行访问

struct Person arr[] = {{1, 'f', 62.5}, {2, 'f', 22.5}, {3, 'f', 33.5}};

除此之外,结构体内部也可以存放数组和结构体。

struct Date

{

int year;

int month;

int day;

};

struct Person

{

// 内嵌结构体,不允许结构体内嵌自己结构体类型的变量,因为系统无法确定需要创建多大的内存

struct Date birthday;

};

此时对内嵌结构体成员的访问形式为p.birthday.year 先单层访问到 birthday,再访问到 year。

这里注意,当在结构体中定义了一个 char 类型的数组时,可以通过初始化为其赋值,也可以通过strcpy(p.name, "Li Hua")的方式进行赋值,但是不能直接使用p.name = "Li Hua",因为p.name是一个数组名,相当于一个指针常量,固定指向这个数组的第一个地址,该错误用法的含义是向指针常量赋值,显然是不可行的。

结构体类型别名

在结构体类型声明时,会使用固定的struct XXX形式,并且在后续的使用中都要以这样的形式完整的出现,因此,为结构体起一个别名,可以更加方便的使用结构体变量。

struct Person

{

int number;

char sex;

double money;

}P;

这里的 P 是一个全局变量,可以通过P.sex的形式直接访问成员,但是不推荐以直接定义全局变量的形式创建结构体变量,因为全局变量会在程序运行期间一直消耗内存空间。

typedef struct Person

{

int number;

char sex;

double money;

}P;

此时定义的P是一个类型,就可以通过该类型创建变量,即结构体的别名。

P p1;

如果不需要内嵌,那么就可以使用匿名结构体,即:

typedef struct

{

int number;

char sex;

double money;

}P;

如果将结构体的定义放到一个函数中,并想要在函数的外部进行使用,只能在外部重新再次定义结构体,因为结构体定义在函数内部,无法在外部获取其定义。

此外还要注意,结构体的定义要在使用之前。

结构体字节对齐与位域

struct Person

{

int number;

char sex;

double money;

};

创建了一个这样的结构体后,可以使用sizeof()查看结构体所占内存的大小。

影响结构体所占内存大小的主要因素有:本身成员变量的类型、结构体存在字节对齐

结构体字节对齐是指,如果下一个成员无法在有限的空间内存放,则需要额外的空间,开辟的空间应是结构体内部最大的单成员变量的整数倍。例如上述结构体中,自身对齐最大的为 double 类型,其占用8个字节,因此 int 和 char 就要共同占用8个字节以保证和最大单元对齐,此时占用内存大小为 16 字节,如果将结构体中的变量声明顺序调换一下

struct Person

{

int number;

double money;

char sex;

};

同样的是与 8 字节的 double 类型进行对齐,但 int 和 char 是分开的,无法再共同占用8字节,所以此时的结构体占用的内存大小为24。

那么如何优化字节对齐呢?第一种方式是按照有限空间合理排布成员顺序,第二种是通过 #pragma pack(size) 来更改字节对齐的方式。

#pragma pack(1)

// 字节对齐按照1字节对齐,无额外空间的方式,直接等于所有字节大小相加

// size允许的取值为1、2、4、8、16,即与实际的基础类型字节大小相匹配

struct Person

{

int number;

double money;

char sex;

};

位域,也是一种优化结构体占用内存的方式,针对于整数类型的成员变量,可以通过位域指定其所占内存位的多少,但要注意,无法超越其本身的位数,例如,char 类型不能超过8位。

struct Person

{

int number:1;

char sex:1;

double money;

};

共用体与枚举

定义方式:

union Message

{

int number;

char sex;

double money;

};

使用共用体类型创建变量union Message m1,共用体所占内存的大小只与最大的元素的大小有关,其对于共用体的大部分操作和结构体一样。但需要注意,因为共用体只有一个内存,不可以按照结构体初始化的方式对所有成员变量进行初始化。其初始化只需要对其中某一个成员进行初始化。

枚举的定义:

enum Week

{

Mon, Tue

};

enum Week w1 = Mon;

枚举类型其本质还是正整数类型,可以为枚举元素指定其值的大小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值