C语言结构体及位域
一.结构体
1.定义和声明
结构体是由不同数据类型数据构成的组合型的数据结构,是用户自定义的数据类型。
2.结构体类型的声明格式:
struct 结构体名
{
成员列表
};
举个例子,写一个用来放学生信息的结构体
struct STU
{
char name[20]; //用来放学生姓名的数组
char num[10]; //用来存放学生学号的数组
char cla[10]; //用来存放学生班级的数组
char add[20]; //用来存放学生地址的数组
float score; //用实型来存放学生的成绩
}; //最后要加上';'
3.结构体变量的定义、初始化及使用
(1)结构体变量的定义(studentA是变量,student是类型)
struct student{ //基本用法
char name[10]; //姓名
char num[10]; //学号
float score; //成绩
};
student studentA;
struct student {
char name[10]; //姓名
char num[10]; //学号
float score; //成绩
} studentA;
struct {
char name[10]; //姓名
char num[10]; //学号
float score; //成绩
} studentA;
或者
typedef struct { //推荐使用
char name[10]; //姓名
char num[10]; //学号
float score; //成绩
} student;
student studentA;
typedef struct {
char name[10]; //姓名
char num[10]; //学号
float score; //成绩
} student,*stu;
student studentA;
//用typedef关键字为结构体类型定义一个别名;
4.结构体变量的初始化
//可以直接在定义结构体变量的时候初始化
struct student{ //基本用法
char name[10]; //姓名
char num[10]; //学号
float score; //成绩
};
student studentA;
studentA = {"name","num",75}; //直接在这里初始化
struct student{
char name[10];
char num[10];
float score;
} studentA = {"name","num",75}; //直接在这里初始化
struct {
char name[10];
char num[10];
float score;
} studentA = {"name","num",75}; //直接在这里初始化
//或者可以先定义结构体变量,再给结构体变量赋值
typedef struct {
char name[10];
char num[10];
float score;
} student;
student studentA;
studentA = {"name","num",75}; //在这里初始化
或者:
strcpy(studentA.name, "John Doe"); // 注意:需要包含头文件<string.h>来使用strcpy
strcpy(studentA.num, "31");
studentA.score = 91.5;
5.结构体成员的使用
//可以通过 结构体变量名.结构体成员名 来单独使用某个单独的成员
//这样一个结构体
#include <stdio.h>
typedef struct {
char name[10];
char num[10];
float score;
} student; //定义结构体变量
int main()
{
student studentA;
strcpy(studentA.name, "Jack");
strcpy(studentA.num, "31");
studentA.score = 89;
printf("%s\n %s\n %f\n",studentA.name, studentA.num, studentA.score); //输出
}
二.位域
1.什么是位域及位域作用
当我们在一个程序中要用到很多,开关量,这些变量只需要存储0和1,这时候我们就不需要那么多的内存空间,我们只需要每个变量的1位就可以存储
struct Keyy
{
int key1 : 1; //定义它们的所占的宽度为1位
int key2 : 1;
int key3 : 1;
}key;
在结构体的基础上,我们可以规定的它所占二进制的位数,可以节省一定的内存空间
2.位域的定义
跟结构体定义的方式类似,在结构体成员的 后面加上 “:位数”就是他们所占的大小
struct Age
{
int a : 3; //定义a所占的二进制位数为3位可以存储0-7
int b : 4; //b占4位,可以存储 0-15
}age;
要注意下面两点:
结构体成员类型:只能为 int(整型),unsigned int(无符号整型),signed int(有符号整型) 三种类型,决定了如何解释位域的值。
位域的宽度:位域中位的数量。宽度必须小于或等于指定类型的位宽度。
3.位域的使用
使用位域的 方法和使用结构体成员一样
#include <stdio.h>
struct WE
{
unsigned int a : 1; //位域宽度为1
unsigned int b : 3; //位域宽度为3
}cat;
int main()
{
cat.a = 1; //给a和b赋值
cat.b = 7; //三位只能存储0-7,超过7就会出错
printf("a = %d,b = %d\n",cat.a,cat.b); //输出a和b的值
return 0;
}
4.位域大小的计算
位域遵循结构体对齐原则,整个结构体的总大小为最宽基本类型成员大小的整数倍;
(1)示例一
#include <stdio.h>
struct WE
{
unsigned int a : 1; //位域宽度为1
unsigned int b : 2; //位域宽度为3
}cat;
int main()
{
printf("%d",sizeof(cat));
return 0;
}
输出结果:4, 一共占了4个字节。但a,b加起来才3位,还不到一个字节,就是因为最大的基本类型成员unsigned int 占4个字节,整个结构体总大小就要是他的整数倍
(2)示例2
#include <stdio.h>
struct WE
{
unsigned int a : 10; //位域宽度为1
unsigned int b : 5; //位域宽度为2
}cat;
int main()
{
printf("%d",sizeof(cat));
return 0;
}
输出结果: 4,两个成员共占15位不到两个字节,所以总大小应补到4个字节
原文地址:https://blog.csdn.net/xieliru/article/details/140612183
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!