首页 > 其他分享 >C语言结构体及位域

C语言结构体及位域

时间:2024-07-22 15:57:43浏览次数:15  
标签:10 name int C语言 char 体及 位域 studentA

一.结构体

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个字节

标签:10,name,int,C语言,char,体及,位域,studentA
From: https://blog.csdn.net/xieliru/article/details/140612183

相关文章

  • 【保姆级讲解C语言中的运算符的优先级!】
    ......
  • C语言初学者入门指南
    C语言初学者入门指南        在编程的世界里,C语言被誉为“编程语言之母”,它是许多现代编程语言(如C++、Java、Python等)的基石。C语言以其高效、灵活和接近硬件的特性,在操作系统、嵌入式系统、游戏开发等多个领域发挥着重要作用。对于初学者而言,掌握C语言不仅能帮助你理......
  • 数据结构-C语言-排序(3)
            代码位置:test-c-2024:对C语言习题代码的练习(gitee.com)一、前言:1.1-排序定义:        排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序)1.2-排序分类:常见的排序算法:插入排序a. 直接插......
  • C语言-常用算法-23
     题目:分数计算器程序源代码:#include<stdio.h>intgys(intx,inty){returny?gys(y,x%y):x;}intgbs(intx,inty){returnx/gys(x,y)*y;}voidyuefen(intfz,intfm){ints=gys(fz,fm);fz/=s;fm/=s;printf("结果是:%d/%d&quo......
  • C语言-常用算法-22
    题目:分鱼问题A,B,C,D,E五个人在某天合伙去捕鱼,分鱼时,A先将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份;B第二个醒来,也将鱼分为五份,把多余的一条扔掉,拿走自己的一份;C,D,E依次醒来,也按同样的方式拿鱼,问他们至少捕了多少鱼源代码:#include<stdio.h>intsub(intn){if(n......
  • 学习C语言(6)
      整理今天的学习内容1. 数组的概念数组是一组相同类型元素的集合,数组元素个数不能为02.一维数组的介绍(1)数组创建语法type  arr_name[常量值] ↑       ↑      ↑类型   数组名 指定数组大小(2)数组的初始化完全初始化:如:int ......
  • C语言数组的相关案例
    引导案例:数组的遍历:这里需要注意的是我们在遍历数组时是使用for循环,这里则需要计算数组的长度计算公式:sizeof(数组名)/sizeof(数组的数据类型)#include<stdio.h>intmain(){ intarr[]={1,2,3,4,5,6,7,8,9,10}; intlength=sizeof(arr)/sizeof(int); for(i......
  • 基于c语言的贪吃蛇小游戏附带源码
    #include<stdio.h>#include<conio.h>#include<windows.h>#include<time.h>#defineframex5#defineframey5#definewide20#definehigh20inti,j,a[2];//将光标移动到指定位置voidgotoxy(HANDLEhout,intx,inty){//COORD是WindowsAPI中定义......
  • 深入浅出C语言指针(基础篇)
    目录引言一、认识指针指针是什么? 二、指针变量和地址1.取地址操作符2.指针变量3.解引用操作符 4.指针变量的大小 三、指针和指针类型1.指针的类型2.指针+-整数3.指针的解引用四、const修饰指针变量 1.const修饰指向的数据2.const修饰指针本身3.const同......
  • 学习C语言的第一二天
    今天学了C语言的核心语法,对它们有了初步的了解。1.首先是注释,它分为两类,一个是单行注释一个是多行注释。格式的话单行注释就是在所写的注释前加上//,多行注释的话就是用/和/把所需的多行内容框起来。当然了它也有快捷键ctrlk+ctrlc是我们的注释快捷键,而ctrlk+ctrlu是我们的注......