当前位置: 首页 > news >正文

C语言——构造(结构体)

指针——内存操作

我们对于内存的操作借助于 <string.h>这个库提供的内存操作函数。

内存填充

头文件:

#include<string.h>

函数原型:

void*memset(void *s,int c,size_t n);

函数功能:

填充s开始的堆内存空间前n个字节,使得每个字节值为c

函数参数:
        void*s:待操作内存首地址。
        intc:填充的字节数据。
        size_tn:填充的字节数。

返回值:        返回s
注意:

c常常设置为0,用于动态内存初始化

内存拷贝

头文件:

#include <string.h>

函数原型:

                void *memcpy(void *dest,const void *src,size_t n);适合目标地址与源地址内存无重叠的情况。
                void *memmove(void *dest,const void *src,size_t n);

函数功能:

拷贝src开始的堆内存空间前n个字节,到dest对应的内存中。
函数参数:
        void *desk:目标内存首地址。
        void *src:源内存首地址。
        size_t n:拷贝的字节数。

返回值:

        返回dest
注意:内存中请了几个内存空间,就访问几个内存空问,否则数据不安全。

注意:memcpy与memmove一般情况下是一样的,更建议使用memmove进行内存拷贝;

因为memmove函数是自适应(从后往前或者从前往后)拷贝,当被拷贝的内存和目的地的内存有重叠时,数据不会出现拷贝错误。而memcpy函数是从前往后拷贝,当被拷贝的内存和目的地内存有重叠时,数据会出现拷贝错误。

内存比较

头文件:

#include <string.h>
函数原型:

int memcmp(void *dest,const void *src,size_t n)
函数功能:

比较src和dest所代表的内存前n个字节的数据;
函数参数:
        void *dest;目标内存首地址
        const void* src;源内存首地址
        size_tn;比较的字节数

返回值:
0:数据相同
>0:dest中的数据大于src

<0:dest中的数据小于src

注意:

n一般和src,dest的总容量一样;如果不一样,内存比较的结果就不确定了。

内存查找

头文件:

#include <string.h>

函数原型:

int *memchr |*memrchr(const void *s,int c,size_t n)

函数功能:

在s开始的堆内存空间前n个字节中查找字节数据c

函数参数:

        const void *s:待操作内存首地址;

        int c:待查找的字节数据

        size_t n:查找的字节数

返回值:

返回查找到的字节数据地址

注意:

如果内存中没有重复数据,memchr和memrchr结果是一样的;如果内存中有重复数据,memchr和memrchr结果就不一样;

构造类型

数据类型分类

1.基本类型

        整数型

                短整型:  short(2个字节)

                整型(默认):int(4个字节)  

                长整型 : long(8个字节)

                长长整型 : longlong

        浮点型

                单精度:float(4个字节)

                双精度:double(8个字节)

              字符型:char(1个字节)

2.指针类型

        数据类型*:int*,char*,float*等

        void*:任意数据类型的指针

3.空类型

        void:没有返回值或没有形参(不能定义变量)

4.自定义类型/构造类型

        结构体类型:struct

        共用体类型(联合体):union

        枚举类型:enum

注意:整数型和字符型分有符号signed和无符号unsigned,默认是有符号,有符号可以省略关键字signed

结构体

定义:

自定义数据类型的一种,关键字struct,结构体类型的变量可以存储多个不同数据类型的数据

定义格式:

struct 结构体名
{数据类型1  成员名称1;数据类型2  成员名称2;...
}

注意:

结构体中定义的变量,我们称之为成员变量。

格式说明:

        结构体名:合法的标识符,建议单词的首字母大写

        数据类型n:C语言支持的所有类型

        成员名称:合法的标识符,就是变量的命名标准

        数据类型n   成员名称n:类似于定义变量,定义了结构体中的成员

注意:

        结构体在定义的时候,成员不能赋值

常见的定义格式:

        方式1:常规定义(只定义类型) ---推荐

struct Student
{int num;//学号char name[20];//姓名char sex;// 性别int age;// 年龄char address[100];//家庭住址
}

        方式2:定义匿名结构体(常用于作为其他结构体的成员使用)

struct Dog
{char *name;// 姓名int age;// 年龄struct{ int year;//年int month;//月int day;// 日}birthdays;
}

注意:

定义匿名结构体的同时必须定义结构体变量,否则编译报错,结构体可以作为另一个结构体的成员

总结:

        1>结构体可以定义在局部位置,也可以定义在全局位置:

        2>全局位置的结构体名和局部位置的结构体名可以相同,就近原则(和普通变量的定义同理)

结构体类型的使用:

利用结构体类型定义变量,定义数组;结构体类型的使用与基本数据类型的使用类似。

结构体变量的定义

结构体变量也称为结构体的实力。

第一种

1)先定义结构体

2)然后使用struct 结构体名 变量名;

//先定义结构体(先定义结构体这个数据类型)
struct A
{int a;char b;
}// 定义结构体变量
struct A x;
struct A y;
第二种

在定义结构体的同时,定义结构体变量;

//先定义结构体(先定义结构体这个数据类型)
struct A
{int a;char b;
}x,y;

此时定义了一个结构体A,x和y是这个结构体类型的变量。

第三种:不推荐

在定义匿名结构体的同时,定义结构体变量;

struct
{int a;char b;
}x,y;struct
{int a;char b;
}z;

此时定义了一个没有名字的结构体(称为匿名结构体);y,x是这个匿名结构体类型的变量;

匿名结构体:---弊大于利(尽量少用)

        优点:少写一个结构体名称

        缺点:只能使用一次,定义的结构体类型的同时就必须定义变量。

        应用场景:

这里————————————

结构体变量的使用

结构体变量访问结构体成员
格式:       

结构体变量名,成员名;

可以通过访问给成员赋值(存数据)

可以通过访问获取成员的值(取数据)

结构体变量未初始化,结构体的成员值随机(不确定)

结构体变量在定义时,可以初始化
        建议用大括号标明数据的范围
        结构体成员初始化时,可以部分初始化,部分初始化时一定要带大括号标明数据的范围

结构体数组的定义

什么时候需要结构体数组?

比如:我们需要管理一个学生对象,只需要定义一个struct student majie;
假如:我们需要管理多个学生对象,此时就需要一个结构体的数组 struct student students[64];。

第一种:

先定义结构体类型,然后定义结构体变量,再将变量存储到结构体数组中

//定义一个学生类型的结构体
struct Student
{char *name;int age;float scores[3];// 三门课程的成绩
};// 定义结构体对象struct Student zhangsan ={"张三",23,{67.5,89.0,90.0}};struct Student lisi ={"李四",21,{77.0,80.0,85.0}};// 定义结构体数组struct Student student[3] = {zhangsan,lisi};
第二种:

定义结构体类型,然后定义结构体数组并初始化

// 定义一个学生类型的结构体
struct Student
{int id;char *name;int age;float scores[3];// 三门课程的成绩
};//定义结构体数组并初始化
struct Student students[3]={{1,"张三",23,{67.5,89.0,90.0}},// 注意:这里赋值的顺序需要跟成员在结构体中的顺序一致{2,"李四",21,{77.0,80.0,85.0}}
}
第三种:

定义结构体类型同时定义结构体数组并初始化

//定义一个学生类型的结构体
struct Student
{int id;char *name;int age;float scores[3];// 三门课程的成绩
}students[3]={{1,"张三",23,{67.5,89.0,90.0}},// 注意:这里赋值的顺序需要跟成员在结构体中的顺序一致{2,"李四",21,{77.0,80.0,85.0}}
};
第四种:

定义结构体类型同时定义结构体数组,然后通过索引给结构体成员赋值

//定义一个学生类型的结构体
struct Student
{int id;char *name;int age;float scores[3];// 三门课程的成绩
} sts[3];sts[0].id = 1;
sts[0].name =“张三”:
sts[0].age = 12;
sts[0].scores[0]= 98;

小贴士:

结构体数组名访问结构体成员;

格式:结构体数组名 -> 成员名

相关文章:

C语言——构造(结构体)

指针——内存操作 我们对于内存的操作借助于 <string.h>这个库提供的内存操作函数。 内存填充 头文件: #include<string.h> 函数原型: void*memset(void *s,int c,size_t n); 函数功能&#xff1a; 填充s开始的堆内存空间前n个字节&#xff0c;使得每个字节值为c…...

京东2025届秋招 算法开发工程师 第2批笔试

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/17 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;2h 本试卷还有选择题部分&#xff0c;但这部分比较简单就不再展示。 1. 第一题 村子里有一些桩子&#xff0c;从左到右高度依次为 1 , 1 2…...

模具监视器的技术参数有哪些

模具监视器的技术参数涵盖了多个方面&#xff0c;这些参数对于确保模具监视器的性能、稳定性和检测精度至关重要。以下是一些主要的技术参数&#xff1a; 一、显示器参数 屏幕尺寸&#xff1a;常见的模具监视器显示器尺寸为12.5英寸至13.5英寸&#xff0c;具体尺寸可能因不同…...

使用QGIS配置管线流向地图

一、需求概述 在管网项目中,需要进行地图配置使用QGIS显示管网的流向。 二、目标 配置一副管网地图,可以在地图上显示出每个管段的流向。 三、数据结构 管网数据: id[管线编码]source[起始节点ID]target[终点节点ID]dir[方向]1100101FT2101102FT……………………节点数据…...

白骑士的C#教学附加篇 5.1 C#开发工具

系列目录 上一篇&#xff1a;白骑士的C#教学实战项目篇 4.4 游戏开发 在这一部分&#xff0c;我们将介绍一些额外的内容和工具&#xff0c;以帮助您提高 C# 开发的效率和质量。掌握合适的开发工具和调试技巧&#xff0c;可以让您在编写和维护代码时更加高效和从容。 开发工具对…...

C++中的多线程编程和锁机制

二、多线程、锁 2.1 C语言线程库pthread&#xff08;POSIX threads&#xff09; 2.2.1 线程创建 pthread_create #include <pthread.h>pthread_t thread; ThreadData args {1, "Hello from parameterized thread"}; int result pthread_create(&threa…...

【投融界-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

自动打电话软件给企业带来了什么?

使用机器人外呼系统肯定都是想要给自己企业带来好处和解决问题的&#xff0c;想让自己的企业有所改变&#xff0c;有更好的发展&#xff0c;所以才会选择使用机器人外呼系统。而它也确实没让大家失望&#xff0c;使用了机器人外呼系统之后确实有许多企业发生了很大改变和进步&a…...

聚鼎科技:新手做装饰画生意卖什么比较好

在艺术的广阔天地里&#xff0c;装饰画以其独特的魅力逐渐成为室内装饰不可或缺的元素。对于刚入行的新手而言&#xff0c;选择合适的装饰画产品至关重要&#xff0c;它关系到业务的成功与否。以下是一些关于新手做装饰画生意卖什么比较好的建议。 考虑到市场需求的多样性&…...

从零开始搭建k8s集群详细步骤

声明&#xff1a;本文仅作为个人记录学习k8s过程的笔记。 节点规划&#xff1a; 两台节点为阿里云ECS云服务器&#xff0c;操作系统为centos7.9&#xff0c;master为2v4GB,node为2v2GB,硬盘空间均为40GB。&#xff08;节点基础配置不低于2V2GB&#xff09; 主机名节点ip角色部…...

大模型智能体可以用来实现哪些需求?

大模型智能体可以用来实现广泛的需求&#xff0c;以下是一些常见的应用场景&#xff1a; 自然语言处理&#xff08;NLP&#xff09;应用 文本生成&#xff1a;自动撰写文章、编写代码、生成新闻摘要。 对话系统&#xff1a;智能客服、虚拟助手、聊天机器人。 语言翻译&#xf…...

Vue 3 组合式 API 全面讲解:defineCustomElement

Vue 3 引入的组合式 API&#xff08;Composition API&#xff09;为开发者提供了更加灵活和强大的代码组织能力。除了常用的 defineComponent 用于定义普通组件外&#xff0c;Vue 3 还提供了 defineCustomElement 函数&#xff0c;允许开发者定义可在 Web Components 规范下使用…...

SwiftUI 6.0(iOS 18)监听滚动视图视口中子视图可见性的极简方法

概览 在 SwiftUI 的应用开发中,我们有时需要监听滚动视图中子视图当前的显示状态:它们现在是被滚动到可见视口(Viewport)?或仍然是隐藏在“未知的黑暗”中呢? 在 SwiftUI 早期版本中为了得偿所愿,我们需要借助一些“取巧”的手段。不过,从 SwiftUI 6.0(iOS 18)开始情…...

分享五种mfc140.dll丢失如何修复?五种修复错误的详细解决办法

在Windows操作系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;文件扮演着至关重要的角色&#xff0c;它们为应用程序提供了共享的函数和资源。其中&#xff0c;mfc140.dll是Microsoft Visual C 2015 Redistributable Package的一部分&#xff0c;对于许多使用Microso…...

MATLAB 手动实现投影密度法分割建筑物立面 (73)

专栏文章往期回顾,包含本文章 MATLAB 手动实现投影密度法分割建筑物立面 (73) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 从原始点云中,自动分割提取建筑物立面点云用于立面绘图,可以减少人为操作流程。这里从0开始,手动实现一种基于投影密度法的建筑物立…...

QT的基础数据类型(上)

本文将介绍几个QT中常用的数据类型 QString 是处理字符串的主要类 使用Unicode编码,每个字符是16位的QChar 初始化 QString的初始化方法有以下几种: //字符串常量初始化QString str1 = "Hello, World! str1";//使用构造函数初始化QString str2("Hello, Wo…...

【系统分析师】-综合知识-系统架构

1、设计模式 1&#xff09;观察者模式定义了对象间的一种一对多依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中&#xff0c;发生改变的对象称为观察目标&#xff0c;被通知的对象称为观察者&…...

华为AR1220配置GRE隧道

1.GRE隧道的配置 GRE隧道的配置过程,包括设置接口IP地址、配置GRE隧道接口和参数、配置静态路由以及测试隧道连通性。GRE隧道作为一种标准协议,支持多协议传输,但不提供加密,并且可能导致CPU资源消耗大和调试复杂等问题。本文采用华为AR1220路由器来示例说明。 配置…...

前端面试题-什么是JavaScript的闭包?有哪些应用场景?

定义: 一个函数能够访问其它函数内部定义的变量 形成的原理: (1)函数创建&#xff1a;在一个函数&#xff08;外部函数&#xff09;中定义另一个函数&#xff08;内部函数&#xff09;。 (2)内部函数访问&#xff1a;内部函数可以访问和修改外部函数中的局部变量。 (3)函数…...

Xilinx XAPP585相关

XAPP585中相关的状态机 第一个状态机&#xff1a;这里主要是在对时钟线延迟的基础上&#xff0c;通过BITSLIP操作&#xff0c;做时钟的对齐&#xff1b; 第二个状态机&#xff1a;这里对c_delay_in所做的操作&#xff0c;主要是对时钟线的延迟进行控制&#xff1b; delay_con…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...