c语言中数据结构

news2025/2/8 13:46:56

一、结构体的由来

1. 数据类型的不足

C语言中,基本数据类型只有整型、字符型、浮点型等少数几种,无法满足复杂数据类型的需要。

2. 数组的限制

虽然数组可以存储多个同类型的数据,但是数组中的元素个数是固定的,无法动态地改变大小。

3. 指针的局限性

指针只能指向一个变量,无法同时指向多个变量。

为了解决以上问题,C语言引入了结构体(struct)这一复合数据类型。结构体是由一组不同类型的变量组成的集合,可以方便地表示复杂的数据结构。
在这里插入图片描述

二、结构体的使用方法

1. 定义结构体类型

使用关键字struct和大括号{}来定义结构体类型,其中包含若干个成员变量。例如:

struct Student {
    char name[20];
    int age;
    float score;
};

上述代码定义了一个名为Student的结构体类型,它包含三个成员变量:name(字符串类型)、age(整型)和score(浮点型)。

2. 声明结构体变量

声明结构体变量时,需要指定其类型为已定义的结构体类型。例如:

struct Student stu1, stu2;

上述代码声明了两个Student类型的结构体变量stu1和stu2。

3. 访问结构体成员变量

通过“.”运算符来访问结构体变量中的成员变量。例如:

strcpy(stu1.name, "Tom");
stu1.age = 18;
stu1.score = 90.5;

上述代码分别给stu1的name、age和score成员变量赋值。
在这里插入图片描述

三、结构体在计算机中的存储方式

1. 内存对齐

为了提高内存读写效率,编译器会对结构体进行内存对齐。内存对齐是指将结构体中的成员变量按照一定的规则排列在内存中,使得它们的地址都是某个特定值的倍数。例如,对于一个int类型的变量,它的地址必须是4的倍数;对于一个char类型的变量,它的地址必须是1的倍数。如果某个成员变量按照默认对齐方式排列后,其地址不是某个特定值的倍数,编译器会在其前面填充一些空白字节,使其地址变为某个特定值的倍数。例如:

struct Student {
    char name[20]; // 地址为0x00000000,不需要对齐
    int age;       // 地址为0x00000004,需要对齐,填充2个空白字节(即地址为0x00000004)
    float score;   // 地址为0x00000008,需要对齐,填充3个空白字节(即地址为0x00000008)
};

2. 结构体的大小计算

结构体的大小等于其所有成员变量的大小之和。如果成员变量之间有空白字节,那么这些空白字节也会被计算在内。例如:

struct Student {
    char name[20]; // 占用20个字节(包括末尾的'\0')
    int age;       // 占用4个字节(假设为int类型)
    float score;   // 占用4个字节(假设为float类型)
};

上述代码中,Student结构体的大小为24个字节(20+4+4=28),因为name数组后面有3个空白字节(即sizeof(name)=23)。需要注意的是,不同的编译器可能会对结构体的内存对齐方式和大小计算方法有所不同。因此,在编写程序时应该尽量避免依赖于具体的内存布局细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1336093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何恢复未保存/误删除的 Excel 文件

想象一下,在处理一个重要的Excel文件时,如果Excel突然崩溃,你被迫关闭它而不保存文件,那会是什么感觉?我知道这是一种可怕的感觉,避免这种情况的最佳方法是使用自动保存功能。但是这个功能也能帮助找回已删…

shell 编程中内置的变量(冷门又好用)

简介 分别盘点一下 shell 中的内置变量,真的巨好用!!!包括:环境变量类、shell 变量类、终端设置类和其他一些变量。 常用的内置变量目录如下 1. 环境变量类 $MACHTYPE:机器类型 $OSTYPE:操作…

【Python高阶技巧】闭包、装饰器

一、闭包 1、闭包的用途和用法2、nonlocal关键字的作用闭包注意事项 优缺点 二、装饰器 装饰器的作用和用法 一、闭包 在编程中,闭包(Closure)是指一种函数对象,它可以访问其自身范围(词法作用域)之外…

详细讲解Java8中的forEach()用法

目录 前言1. forEach()函数2. demo 前言 在实战中学习新用法,特此记录下每个笔记,感兴趣也可收藏也可补充细节 代码例子: import java.util.Arrays; import java.util.List;public class ForEachExample {public static void main(String[…

shell 循环遍历的详细用法

简介 在 shell 脚本中,循环结构用于重复执行一组代码块,包括 for 循环、while 循环,可以用于遍历数字、字符串、数组、文件等。这篇文章会详细介绍这两种遍历方式,以及各种实例场景。 文章目录结构如下 1. 循环遍历的特点 2. 循…

VMware安装linux系统二

1、设置光驱 1.1、编辑虚拟机设置 1.2、设置虚拟机镜像 1.3、设置好后开机 2、安装Linux系统 2.1、等待安装 2.2、开始安装 2.3、选择语言,我选择中文 2.4、本地化不用改 2.5、软件选择一定要选,否则就会是默认最小安装 2.6、我这里选择的是带GUI的&am…

Java---IO流讲解(2)

文章目录 1. 字符流1.1 为什么出现字符流1.2 字符流写数据的5种方式1.3 字符流读数据的两种方式1.4 字符缓冲流1.5 字符缓冲流特有功能 2. IO流小结2.1 字节流2.2 字符流 1. 字符流 1.1 为什么出现字符流 由于字节流操作中文时不是特别方便,因此Java提供了字符流。…

分包zip压缩,解压报错:invalid zip file with overlapped components (possible zip bomb)

背景 在生产环境中,需要把安装包从本地传到服务器上,传输过程中网络抖动的原因造成大文传输失败。可以将文件分包压缩成200M或500M大小的文件,然后分批传输到服务器。最近生产环境传输了starrocks的安装包,分包压缩之后上传服务器…

uniapp中如何使用image图片

当在UniApp中使用图片时&#xff0c;可以通过<image>标签将图片显示在页面上。这个标签可以指定src属性来引用图片&#xff0c;并且可以通过mode属性来设置图片的显示模式。除此之外&#xff0c;还可以利用click事件来实现图片的点击事件。在编写代码时&#xff0c;要注意…

鸿蒙项目二—— 注册和登录

此部分和上篇文章是连续剧 &#xff0c;如果需要&#xff0c;请查看 一、注册 import http from ohos.net.http; Entry Component struct Reg {// 定义数据&#xff1a;State username: string "";State userpass: string "";State userpass2: string …

Java@RequestParam注解和@RequestBody注解接收参数

目录 Java后端接收数据 第一章、后端不写任何注解情况下接收参数1.1&#xff09;后端不写注解postman发出get请求1.2&#xff09;后端不写注解postman发出post请求 第二章、后端写RequestParam注解接收参数2.1&#xff09;postman发出post请求2.2&#xff09;postman发出get请求…

腾讯云上mysql连接不上

腾讯云服务器默认没开放&#xff0c;3306端口。 1.去腾讯云控制台 2.找到自己的服务器 3选择防火墙 4.添加规则 至此完事了。

Redis数据结构(常用5+4种特殊数据类型)

1、Redis 数据类型以及使用场景分别是什么&#xff1f; Redis 提供了丰富的数据类型&#xff0c;常见的有五种数据类型&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff…

面试复盘2——测试开发——一面+二面

前言 本文主要用于个人复盘学习&#xff0c;因此为保障公平&#xff0c;所以本文不指出公司名&#xff0c;题目编号只是为了自己区别而已。对待面经&#xff0c;望读者还是更多从其中学习总结&#xff0c;而不是去碰原题。 面试岗位信息 测试开发工程师&#xff0c;秋招但需…

Spring Boot3 Web开发技术

前期回顾 springboot项目常见的配置文件类型有哪些&#xff1f;哪种类型的优先级最高 yml properties yaml 读取配置文件里的数据用什么注解&#xff1f; value restful风格 RESTful 风格与传统的 HTTP 请求方式相比&#xff0c;更加简洁&#xff0c;安全&#xff0c;能隐…

基于AR+地图导航的景区智慧导览设计

随着科技的飞速发展&#xff0c;智慧旅游已经成为现代旅游业的一个重要趋势。在这个背景下&#xff0c;景区智慧导览作为智慧旅游的核心组成部分&#xff0c;正逐渐受到越来越多游客的青睐。本文将深入探讨地图导航软件在景区智慧导览中的应用&#xff0c;并分析其为游客和景区…

pytorch中池化函数详解

1 池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件&#xff0c;池化层经常用在卷积层后边&#xff0c;通过池化来降低卷积层输出的特征向量&#xff0c;避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的视觉系统…

整数规划-割平面法

整数规划-割平面法 割平面法思想Gomorys割平面法原理实例 谨以此博客作为学习期间的记录。 割平面法思想 在之前&#xff0c;梳理了分支定界法的流程:分支定界法 除了分支定界法&#xff0c;割平面法也是求解整数规划的另一个利器。 我们已经知道&#xff0c;线性规划的可行域…

XStream 反序列化漏洞 CVE-2021-39144 已亲自复现

XStream 反序列化漏洞 CVE-2021-39144 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建 修复建议总结 漏洞名称 漏洞描述 在Unmarshalling Time处包含用于重新创建前一对象的类型信息。XStream基于这些类型的信息创建新实例。攻击者可以控制输入流并替换或注入对象&am…

LeetCode-回文链表(234)

题目描述&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 因为这一题是受到876题求链表中间节点的启发&#xff0c;所以在这里也加一下。 876.链表的中间结点…