自学内容网 自学内容网

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)!