C语言学习笔记-结构体-位域

#include "pch.h"
#include <iostream>
/*本文演示结构体struct的用法,还有位域
数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

struct tag {
    member-list
    member-list
    member-list
    ...
} variable-list ;

tag 是结构体标签,就是结构体类型的名字。
member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为实例:

*/
//如下定义了一个结构体类型叫:Student, 同时声明3全局个变量lily,willion,hary
struct Student
{
    int id; //学号
    char name[20]; //名字
    int age; //年龄
}lily, willion, hary;  


//第2种样子,可以省略variable-list
struct Student1
{
    int id; //学号
    char name[20]; //名字
    int age; //年龄
};

//第3中样子,可以省略结构体类型名, 但声明了两个变量。
struct 
{
    int id; //学号
    char name[20]; //名字
    int age; //年龄
}penny,jane;

//第4中,使用typedef 创建新类型
// 使用时变量声明形如: Student3 lily,hary,penny,jane
typedef struct
{
    int id; //学号            4byte
    char name[20]; //名字   20byte
    int age; //年龄            4byte
}Studen3;

//结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。

struct people        //大小为36byte
{
    int height;        //4byte
    int weight;        //4byte
    Student stu;    //嵌套了Student结构体 28byte
};

//结构体实现了链表的功能。
struct human        //16个字节。
{
    int height;        //4byte
    int weight;        //4byte
    Student* stu;    //嵌套了Student结构体28byte,但此处是指针,所以为4个byte
    human* hu;        //指向字节的类型,实现了链表的功能。 占用4个字节
};

/*
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。
例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。
为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。
所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。
每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
*/

//一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。
//也可以有意使某位域从下一单元开始
//在win10 64 位系统中,下面结构体的长度为至少一个int 4字节。
struct MyLed
{
    unsigned  onoff : 2;    //指示灯的状态 0=熄灭  1=亮   2=闪烁1   3=闪烁2
    unsigned fre : 3;    //闪烁频率 
    unsigned delay : 3;  //延时  0-7秒
    unsigned : 2;        //空域,不用。
    unsigned speed : 6;  //0-64

    unsigned speed1 : 6;  //0-64 多定义一个speed1, 位域结构体大小仍未4字节。
};


int main() 
{
    Student raj; //在声明个变量
    Studen3 band, lennard;

    MyLed led1;
    led1.onoff = 2;
    led1.fre = 1;
    led1.speed = 64;
    led1.delay = 6;
    printf("led1.onoff=%d\n", led1.onoff);
    printf("led1.fre=%d\n", led1.fre);
    printf("led1.delay=%d\n", led1.delay);
    printf("led1.speed=%d\n", led1.speed);

    printf("sizeof(led1)=%d \n", sizeof(led1));  //4个字节,按int分配的一个空间。
    printf("sizeof(int)=%d \n",sizeof(int));


    penny.id = 100;

    band.id = 10;

    lily.id = 1001;
    lily.age = 18;

    willion.id = 1002;
    willion.age = 19;

    hary.id = 1003;
    hary.age = 17;

    raj.id = 1004;
    raj.age = 19;

    printf("raj's age is %d \n", raj.age);
    printf("sizeof struct student=%d \n", sizeof(Student));
    printf("sizeof struct people=%d \n", sizeof(people));
    printf("sizeof struct human=%d \n", sizeof(human));

    printf("sizeof long=%d \n",sizeof(long));        //4字节
    printf("sizeof double=%d \n", sizeof(double));    //8字节
    return 0;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值