Linux C:构造数据类型

目录

一、结构体(struct)

1.1类型定义

1.2 结构体变量定义

1.3 结构体元素初始化

1.4 结构体成员访问

1.5 结构体的存储(内存对齐)

1.6 结构体传参


本文主要记录了C语言中构造数据类型部分的内容,今天暂时只写了结构体的内容,关于结构体的定义、变量定义、初始化、访问、存储和传参问题,很好理解,后续共用体(联合体)和枚举问题将于明天进行更新。

一、结构体(struct)

结构体是一种自定义的复合数据类型,用于将不同类型的数据组合成一个整体,方便对相关数据进行统一管理和操作。

1.1类型定义

struct 结构体名 {
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
...
};struct date {
int year;
int mon;
int day;
};struct time {
int hour;
int min;
int sec;
};struct student {
char name[32];
char sex;
int age;
int score;
};

基本格式:使用struct关键字,后跟结构体名,大括号内包含多个成员变量(成员可以是基本数据类型、其他结构体类型等),最后以分号结尾。

  • 说明:定义的是结构体类型,并非变量,就像int是类型,不是具体变量一样。

1.2 结构体变量定义

定义:存储类型 + 结构体类型 + 变量名。

struct student stu1;  //(定义一个struct student类型的变量stu1

注意:存储类型可省略,默认是自动存储类型(auto)。

1.3 结构体元素初始化

  1. 全部初始化:按成员顺序依次赋值。
    struct student stu = {"zhangsan", 'm', 18, 90};
  2. 局部初始化:可指定部分成员赋值,未赋值的成员自动为 0(数值型)、空字符(字符型)等默认值。
     
    struct student stu = {.name = "zhangsan",  // 指定name成员赋值.score = 90          // 指定score成员赋值
    };
    

1.4 结构体成员访问

  • 结构体变量访问成员:使用.运算符,格式为 “结构体变量名 . 成员名”
  • 结构体指针访问成员:使用->运算符,格式为 “结构体指针名 -> 成员名”
.    :结构体变量类型访问成员变量 .
->   :结构体指针类型访问成员变量 ->结构体访问成员变量最终的类型由成员变量的类型决定

1.5 结构体的存储(内存对齐)

  1. 结构体成员必须存放在内存地址为自身类型长度整数倍的内存单元中。例如int类型成员(占 4 字节)的地址必须是 4 的倍数。
  2. 结构体的总大小必须为自身最大成员类型长度的整数倍。
  • struct student {char name[32];char sex;int age;int score;
    };

作用:内存对齐是为了提高 CPU 对内存的访问效率,硬件层面更易读取对齐的地址。

1.6 结构体传参

1.传值方式:函数参数是结构体变量,实参将整个结构体的内容拷贝给形参,缺点是当结构体较大时,拷贝开销大。

void fun(struct student tmp);

2.传地址方式:函数参数是结构体指针,实参将结构体的地址传递给形参,仅拷贝 8 字节(64 位系统指针大小),效率更高,且可通过指针修改原结构体内容。

void fun(struct student *ptmp);

建议:优先使用传地址方式,尤其对于大型结构体;

           传地址更好,因为实参将8字节拷贝给形参,避免结构体大空间的拷贝;

二. 共用体(union,联合体)

共用体与结构体的核心区别是所有成员共享同一块内存空间,空间大小等于最大成员的大小,适用于 “同一空间存储不同类型数据” 的场景(如节省内存、判断内存大小端)。

(1)定义与特性
  • 定义格式:union 共用体名 {成员列表};
    union Data {int i;    // 占4字节float f;  // 占4字节char c;   // 占1字节
    };  // 总大小为4字节(最大成员int和float均为4字节)
    
  • 特性:任一时刻只有一个成员有效,修改一个成员会覆盖其他成员的值。
(2)应用:判断内存大小端

内存大小端是指多字节数据在内存中的存储顺序:

  • 小端存储:低地址存储数据的低字节(如 0x12345678,低地址存 0x78);
  • 大端存储:低地址存储数据的高字节(如 0x12345678,低地址存 0x12)。

利用共用体判断:

#include <stdio.h>
union CheckEndian {int num;    // 4字节char c;     // 1字节(共享num的低地址空间)
};int main() {union CheckEndian u;u.num = 0x12345678;if (u.c == 0x78) {printf("小端存储\n");  // 低地址存低字节0x78} else if (u.c == 0x12) {printf("大端存储\n");  // 低地址存高字节0x12}return 0;
}

三. 枚举(enum)

枚举用于定义一组命名的常量,使代码更具可读性,适用于表示 “有限的状态或选项”(如颜色、星期、错误码等)

(1)定义与特性
  • 定义格式:enum 枚举名 {常量1, 常量2, ...};
    enum Weekday {MON,  // 默认为0TUE,  // 默认为1(前一个+1)WED = 5,  // 手动赋值为5THU   // 自动为6(5+1)
    };
    

  • 特性:所有枚举常量均为 int 类型,不能直接赋值给其他类型(需强制转换)。
(2)应用场景
  • 状态标识:如enum Status {SUCCESS, ERROR, PENDING};,比直接用 0、1、2 更易读。
  • 限制变量取值:enum Color {RED, GREEN, BLUE} c; c = RED;(只能取枚举中的值)。

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

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

相关文章

Python:self

在Python面向对象编程中&#xff0c;self是一个指向类实例自身的引用参数&#xff1a;‌1. 本质与作用‌‌身份标识‌&#xff1a;self是类实例化后对象的"身份证"&#xff0c;代表当前实例本身&#xff0c;用于区分不同实例的属性和方法‌‌自动传递‌&#xff1a;调…

【SpringMVC】SpringMVC的概念、创建及相关配置

什么是SpringMVC 概述 中文翻译版&#xff1a;Servlet 栈的 Web 应用 Spring MVC是Spring Framework的一部分&#xff0c;是基于Java实现MVC的轻量级Web框架。 查看官方文档&#xff1a;https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.h…

浅谈存储过程

问题引入 面试的时候有时候会问到知不知道存储过程&#xff0c;用没用过&#xff1f; 是什么 存储过程&#xff08;Stored Procedure&#xff09;是在大型数据库系统中&#xff0c;一组为了完成特定功能的SQL 语句集&#xff0c;它存储在数据库中&#xff0c;一次编译后永久…

maven optional 功能详解

前言 最近参与了一个项目,使用maven管理依赖.项目拆分了很多模块.然后交个多个团队各自开发.最后在一个项目骨架中,把各自的模块引入进来,一起启动. 后来随着项目的深入.引入的jar包变多.发现 jar包太多,编译太慢, 打包之后的war包非常大.这种情况就可以使用optional来优化什么…

Python基础--Day04--流程控制语句

流程控制语句是计算机编程中用于控制程序执行流程的语句。它们允许根据条件来控制代码的执行顺序和逻辑&#xff0c;从而使程序能够根据不同的情况做出不同的决策。流程控制实现了更复杂和灵活的编程逻辑。 顺序语句 顺序语句是按照编写的顺序依次执行程序中的代码。代码会按照…

【同济大学】双速率自动驾驶架构LeAD:端到端+LLM,CARLA实测93%路线完成率,性能SOTA!

近年来&#xff0c;随着端到端的技术快速发展将自动驾驶带到了一个新高度&#xff0c;并且取得了非常亮眼的成绩。由于感知限制和极端长尾场景下训练数据覆盖不足&#xff0c;模型在高密度复杂交通场景下和不规则交通情况下的处理能力不足&#xff0c;导致在开放道路上大规模部…

github与git新手教程(快速访问github)

0 序言 作为一个开发者&#xff0c;你必须知道github和git是什么&#xff0c;怎么使用。 github是一个存储代码等资源的远程仓库&#xff0c;一个大型项目往往需要很多人共同协作开发&#xff0c;而大家如何协同开发的进度与分工等要求需要有一个统一开放保存代码的平台。git…

Windows环境下安装Python和PyCharm

可以只安装PyCharm吗&#xff1f;不可以&#xff01;&#xff01;&#xff01; 开发Python应用程序需要同时安装Python和PyCharm。Python是一种编程语言&#xff0c;PyCharm是一个专门为Python开发设计的集成开发环境&#xff0c;提供丰富的功能以简化编码过程。 一、前期准备…

Qt 嵌入式系统资源管理

在嵌入式系统中&#xff0c;资源&#xff08;CPU、内存、存储、网络等&#xff09;通常非常有限&#xff0c;因此高效的资源管理对 Qt 应用的稳定性和性能至关重要。本文从内存优化、CPU 调度、存储管理到电源控制&#xff0c;全面解析 Qt 嵌入式系统资源管理的关键技术。 一、…

小杰数据结构(one day)——心若安,便是晴天;心若乱,便是阴天。

1.数据结构计算机存储、组织数据的方式&#xff1b;有特定关系的数据元素集合&#xff1b;研究数据的逻辑结构、物理结构&#xff08;真实存在&#xff09;和对应的算法&#xff1b;新结构仍保持原结构类型&#xff1b;选择更高的运行或存储效率的数据结构。逻辑结构——面向问…

力扣面试150(44/150)

7.30 155. 最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…

Linux实战:从零搭建基于LNMP+NFS+DNS的WordPress博客系统

前言 在数字化时代&#xff0c;拥有一个个人博客是技术爱好者展示成果、分享经验的重要方式。本文将带您从零开始&#xff0c;在Linux环境下通过两台服务器协作&#xff0c;搭建一个功能完整的WordPress博客系统。我们将整合LNMP架构、NFS文件共享和DNS域名解析服务&#xff0c…

Apache Ignite 的对等类加载(Peer Class Loading, P2P Class Loading)机制

这段内容是关于 Apache Ignite 的“对等类加载”&#xff08;Peer Class Loading, P2P Class Loading&#xff09;机制的详细说明。这是 Ignite 为了简化开发而设计的一个非常强大的功能&#xff0c;但同时也存在一些安全和性能上的考量。 下面我将用通俗易懂的语言 结构化解…

预过滤环境光贴图制作教程:第四阶段 - Lambert 无权重预过滤(Stage 3)

在完成高光反射的 GGX 预过滤后,我们还需要处理环境光的漫反射部分。本阶段(Stage 3)将基于 Lambert 分布对环境贴图进行无权重预过滤,生成用于漫反射计算的环境数据。与高光反射的方向性不同,漫反射是光线在粗糙表面的均匀散射,因此需要用更适合均匀分布的 Lambert 模型…

Spring与SpringBoot:从手动挡到自动挡的Java开发进化论

大家好&#xff01;我是程序员良辰&#xff0c;今天我们来聊聊Java开发界的两位"重量级选手"&#xff1a;Spring 和 SpringBoot。它们之间的关系就像手动挡汽车和自动挡汽车——一个给你完全的控制权但操作复杂&#xff0c;一个让你轻松上路但保留了切换手动模式的能…

1.4.Vue 的模板事件

Vue 的模板事件1. 最常见和推荐的做法。将复杂的逻辑封装在 methods 中。<!-- ✅ 正确&#xff1a;调用 methods 中的方法 --> <button click"handleClick">点击我</button>new Vue({methods: {handleClick(event) {// 这里可以写任意语句if (this…

SQLite 子查询详解

SQLite 子查询详解 引言 SQLite 是一种轻量级的数据库&#xff0c;以其简单、易用和跨平台而著称。在数据库查询中&#xff0c;子查询是一个非常重要的概念&#xff0c;它允许我们在查询中使用查询结果。本文将详细讲解 SQLite 中的子查询&#xff0c;包括其定义、用法以及在实…

可以组成网络的服务器 - 华为OD统一考试(JavaScript 题解)

题目描述 在一个机房中,服务器的位置标识在n*m的整数矩阵网格中,1表示单元格上有服务器,0表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网,请你统计机房中最大的局域网包含的服务器个数。 输入描述 第一行输入两个正整数,…

redis,MongoDB等未授权访问靶场复现

redis未授权访问在docker中启动vulhub对应的靶场目录&#xff1a;cd /vulhub-master/redis/4-unacc在kali上安装redis程序进行服务连接安装redis apt-get install redis redis链接 redis-cli -h IP -p 端口输入info可以查看信息接下来我们使用redis-rogue-server来获取命令执行…

设计模式:代理模式 Proxy

目录问题解决方案结构代码代理是一种结构型设计模式&#xff0c;让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许在将请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢&#xff1f; 举个例子&#xff1a; 有这样一…