C语言结构体

2023-11-01

一、结构体的定义:

结构体(Struct)是C语言中的一个重要数据类型,它可以用来存储多个不同类型的变量。结构体类似于一个自定义的数据类型,可以包含多个不同类型的成员变量,每个成员变量可以有自己的数据类型和值。

二、结构体存储数据方式

结构体存储数据遵循两个原则:

 原则一:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。

原则二:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。

三、结构体定义变量的方式

1、在struct{}之后直接定义变量名

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

2、在main函数当中定义变量名

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

int main()
{
    struct Books
}

四、结构体赋值方式以及注意事项

在定义结构体时是不能在结构体里给变量初始化, 因为定义结构体时,并未给其分配内存,所以初值是无法存储的。

就如下面:

struct A{
    int age =18;
    char name[10] = "zs";
}

这个是不允许的!!!

结构体中赋初值有如下方式:

      1、

struct A{
    int age;
    char name[10];
    char sex[4]; 
}

int main()
{
    struct A a = {18,"zs","男"};
}

2、 注意字符数组不能直接a.name = "zs",因为这相当于char name[10];name[10] = "zs",这是不允许的,要用strcpy()函数给字符串数组赋值,但是,如果结构体里定义的是char *name,那么就可以直接a.name = "zs";

struct A{
    int age;
    char name[10];
    char sex[4]; 
}

int main()
{
    struct A a;
    a.age = 4;
    strcpy(a.name,"zs");
    strcpy(a.sex,"男"); 
}

 3、结构体中不能在定义完变量后整体赋初值,如:

struct A{
    int age;
    char name[10];
    char sex[4]; 
}

int main()
{
    struct A a;
   a = {18,"zs","nan"}
}

 4、在定义结构体类型的同时进行结构体变量初始化,这个是可以的

struct student
 {
 char name[32];
 int age;
 char gender;
 double score;
 }Phoebe = {“Phoebe”,17,'F', 92.5};

5、 结构体变量部分初始化:

 struct student
 {
 char name[32];
 int age;
 char gender;
 double score;
 }Phoebe = {“Phoebe”, 17};

6、 结构体变量指定部分初始化:

 struct student
 {
 char name[32];
 int age;
 char gender;
 double score;
 }Phoebe = {.name = “Phoebe”, .score = 17.0};

3、结构体中偏移量问题

1、整个结构体的大小会是结构体中所占字节数最大的那个数据类型的整数倍

2、每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的(以结构体变量首地址为0计算

如:

#include<stdio.h>
struct A{
      char a;
      char b;
       int c;
    double d;
};
int main()
{
    struct A a;
    printf("%ld\n",sizeof(a));
}

其中各数据所占图为:

 (1-8表示字节数)其中double类型在该结构体中所占字节数最大,所以结构体的整体大小应该是double类型的整数倍,也就是8的整数倍

①先存放a,因为a是char类型,占一个字节

②再放b,b也是char类型,占一个字节,a占1个字节,刚好是b类型的1倍,所以b直接放在a后面

③再放c,c是int型变量,占4个字节,因为每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,所以前面空两格,这样的话前面刚好4个字节,所以c放在5的位置

④最后放d,d是double型变量,占8个字节,前面的变量已经占了8个字节(包括空出来的)所以d直接放在下一行

如上,该结构体一共占2×8个字节数,打印结果:

 4、结构体中位域问题

 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位为此,C 语言又提供了一种数据结构,称为"位域""位段",是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数,每个域有一个域名,位域在本质上就是一种结构类型,不过其成员是按二进位分配的,带有预定义宽度的变量被称为位域,在结构体中可以指定数据占多少位,如

struct A{
    char a:5;
    char b:3;
}

int main(){
    struct A a;
}

在一个字节中,一共有八位,而上面a和b刚好能把一个字节占满,故在打印sizeof(a)时,显示出来a占1个字节。遵循的原则,相同的数据类型,在一行中能放的下就放,放不下就重新开一行

(1-8表示位数)

但如果时下面这种情况:

struct A{
    char a:5;
    char b:7;
}

int main(){
    struct A a;
}

因为一个字节八位,a占5位,后面剩下3位,不足以存放b的位数,所以b会在新的一行存放7位,故a所占字节数位2。

还有一种,当里面数据类型不一样时,如:

struct A{
    char a:5;
    char b:7;
    int c:9;
}

int main(){
    struct A a;
}

此时sizeof(a)的大小为4个字节,因为a占5位,但是因为b和a的数据类型一样,当一行里放不下b时,b会在下一行(下一个字节)存放,而c与b的数据类型不一样,所以c会在b的后面继续存放,现在已存放了三行,根据结构体中结构体所占字节大小为结构体中最大数据的字节数的整数倍,所以还会在下一行补充一行,故一共占4个字节。如图所示:

 打印结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言结构体 的相关文章

随机推荐

  • 文件服务器登录格式,服务器公共库开发--读取ini文件格式的类

    created 2008 07 28 filename config h author Lichuang purpose 封装读取ini格式的配置文件操作 include config h include comdef h include
  • c++输出字符数组乱码_c++输出中文乱码解决方案

    问题的原因应该在cmd的编码和c 程序编码 源文件编码 的不同 cmd默认的是gbk编码 而我用的vs code默认是utf 8编码 因而在输出中文文本时会出现乱码 但我也遇到了一个比较怪异的情况 就是cmd和cpp文件编码都是gbk的情况
  • java8常用新特性

    该段代码复制后根据自己需求调整运行 import javax print DocFlavor import java util import java util stream Collectors public class Maim pub
  • 【STM32】HardFault_Handler问题解决的一种办法

    好久没写技术博客了 这次就把农历新年前遇到的问题在这里说一下吧 在用STM32F4写程序 调试时候会遇到程序在调试的时候死在某一段代码上 一直在一段代码上死循环 经过百度以后发现了一些造成这个错误的原因 STM32出现HardFault H
  • 最全解读】各种金融机构的产品分析(银行、证券、基金、信托...)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 目录 一 银行理财产品 1 现有理财业务监管规则 2 理财业务的模式 3 银基合作 二 证券公司 1 证券公司主要业务范围 2 证券公司资管产品分类 三 基金公司 1 基金
  • When allowCredentials is true, allowedOrigins cannot contain the special value “*“ since that cannot

    最近新写springboot 配置跨域配置文件后出现的问题 org springframework web util NestedServletException Request processing failed nested excep
  • 一证通查查询名下互联网账户

    全国互联网账户 一证通查 来啦 核验身份后一键在线查询名下所有关联号码以及注册 名下电话卡查询 https tb3 cn A6zcU6手机号绑定查询 https tb3 cn A3lhMk
  • Vue3.0脚手架安装项目(通过命令行)

    Vue3 0通过命令行来创建Vue脚手架项目 1 先安装node js https nodejs org en download 自行安装 查看node jsb版本 node version 2 全局安装脚手架 npm install g
  • 智能信息处理专业是干嘛的?

    摘要 主要是介绍智能信息处理专业是干嘛的 包括其定义 涉及的领域 学习的内容和算法 发展趋势 工作前景和相关学习资料 def 使用各种智能手段进行信息交换的过程 其中智能信手段包括人工智能 机器智能 计算机智能等技术 所涉及学科 智能信息处
  • linux中感叹号的作用,Linux - 感叹号

    在Linux命令行下令人惊叹的惊叹号 符号在 Linux 中不但可以用作否定符号 还可以用来从历史命令记录中取出命令或不加修改的执行之前运行的命令 下面的所有命令都已经在 Bash Shell 中经过确切地检验 尽管我没有试过 但大多都不能
  • STM32--基本定时器&&通用定时器

    1 定时器概述 定时器分为基本定时器 通用定时器 高级定时器 例如 STM32F10x系列包含4个通用定时器 TIM2 TIM5但是STM32F103Rx系列只有3个通用定时器 TIM2 TIM4 这些通用定时器是完全独立的 不共享任何资源
  • 上传、下载huggingface仓库文件(模型、数据等)

    下载 例如 想要从huggingface hub下载llama 13b模型文件到本地 可以用如下命令 local dir就是你想要下载到的本地文件夹 from huggingface hub import snapshot download
  • MySQl的基本操作

    前言 MySQL是一种关联数据库管理系统 由于其体积小 速度快的特点 数据库CURD 他和前面的oracel的使用方法差不多 这里就不过多叙述 大概记录一下 创建数据库 创建一个名称为mydb1的数据库 默认为latin1 create d
  • Java-用户自定义异常

    Java 用户自定义异常 1 如何自定义异常 继承现有的异常父类 RuntimeException Exception 提供全局常量 serialVersionUID 提供重载的构造器 2 code举例 定义 package p8excep
  • 使用github生成在线前端项目链接

    作为一个前端小白 一开始是想面试的时候可以让HR直观地看到我的前端项目 然后就在网上找方法可以怎么解决我的这个需求 直至昨天 参考各位大佬的笔记和博客 断断续续 摸索了好几天 总算有个自己的网址 看到的方法大致如下 一 使用花生壳软件进行远
  • H5网页跳转打开微信小程序详解(含完整代码)

    限制条件 目前仅支持在微信内打开H5页面 已认证的服务号 服务号绑定 JS接口安全域名 下的网页可使用此标签跳转任意合法合规的小程序 已认证的非个人主体的小程序 使用小程序云开发的静态网页托管绑定的域名下的网页 可以使用此标签跳转任意合法合
  • csharp: Export DataSet into Excel and import all the Excel sheets to DataSet

  • 红帽Redhat—使用VMware Workstation 16 Pro 安装RHEL8.3登陆

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 环境工具准备 二 VMware Workstation 16 Pro虚拟机创建步骤 三 安装RHEL8 3系统操作步骤 四 操作系统的管理方式 五 SSH远程登
  • [java] mvn 使用笔记

    设置版本号 mvn versions set mvn versions commit
  • C语言结构体

    一 结构体的定义 结构体 Struct 是C语言中的一个重要数据类型 它可以用来存储多个不同类型的变量 结构体类似于一个自定义的数据类型 可以包含多个不同类型的成员变量 每个成员变量可以有自己的数据类型和值 二 结构体存储数据方式 结构体存