C语言笔记之结构体和位域

    技术2025-09-05  39

    目录

    结构体位域

    1-结构体

    1、结构体 结构体是用户自定义的一种数据类型,它的作用可以类比成数组。数组,可以在连续的单元中,存储相同数据类型的数据。而结构体,可以在连续的单元中,存储不同数据类型的数据。 2、定义结构体

    格式1:struct 结构体名称 { 结构体内部声明的不同或相同类型的变量… };

    struct DB { int a; int b[5]; char c; };

    格式2:struct 结构体名称 { 结构体内部声明的不同或相同类型的变量… }定义的结构体变量名;

    struct DB { int a; int b[5]; char c; }db;

    格式3:struct { 结构体内部声明的不同或相同类型的变量… }定义的结构体变量名;

    struct { int a; int b[5]; char c; }db;

    格式4:typedef struct { 结构体内部声明的不同或相同类型的变量… }结构体名称;

    typedef struct { int a; int b[5]; char c; }db;

    格式5:typedef struct 结构体名称 { 结构体内部声明的不同或相同类型的变量… }结构体名称别名;

    typedef struct { int a; int b[5]; char c; }db;

    (注意:结构体内部的数据类型可以是任意的,比如int ,数组类型,枚举等)

    2-位域

    位域,是指在指定的数据类型的大小中,去该数据类型的部分内存空间,进行使用。 引用菜鸟

    有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。

    所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

    典型的实例: 用 1 位二进位存放一个开关量时,只有 0 和 1 两种状态。 读取外部文件格式——可以读取非标准的文件格式。例如:9 位的整数。

    其实,位域与结构体几乎一样的,唯一最大不同的是,位域只是用部分内存空间对数据进行存储,另外一部分当做内存对其占用(而不使用)。 引用中文网

    C语言标准规定,位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。

    C语言标准还规定,只有有限的几种数据类型可以用于位域。在 ANSI C 中,这几种数据类型是 int、signed int 和 unsigned int(int 默认就是 signed int);到了 C99,_Bool 也被支持了。

    1、定义位域

    格式: struct 位域结构名 { 位域列表 };

    其中,位域列表的格式 数据类型 位域名:位域长度

    位域长度的最大长度是相应数据类型的最大长度,按位计算。范围:1<=位域长度<=sizeof(数据类型)

    例子

    #include<stdio.h> #include<stdlib.h>//itoa转二进制,方便查看(可不写) //位域 struct DB { int a:8;//int类型,一共占用内存4个字节,也就是32位,这里声明a使用int类型的8位来存储数据,其他内存当做内存对齐使用。 int b:2;//b占用4个字节中2位来存储数据 }; int main() { DB db; db.a=127; db.b=1; printf("a=%d,b=%d",db.a,db.b); db.a=128; db.b=2; printf("a=%d,b=%d",db.a,db.b); return 0; }

    结果

    a=127,b=1 a=-128,b=-2

    原因

    8位范围:即有符号-128<=X<=127,无符号0<=X<=255;8位:0000 0000 2位范围:即有符号-2<=X<=1,无符号0<=X<=3;2位:00

    Processed: 0.010, SQL: 9