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); 函数功能: 填充s开始的堆内存空间前n个字节,使得每个字节值为c…...
 
京东2025届秋招 算法开发工程师 第2批笔试
目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间:2024/08/17 🔄 输入输出:ACM格式 ⏳ 时长:2h 本试卷还有选择题部分,但这部分比较简单就不再展示。 1. 第一题 村子里有一些桩子,从左到右高度依次为 1 , 1 2…...
 
模具监视器的技术参数有哪些
模具监视器的技术参数涵盖了多个方面,这些参数对于确保模具监视器的性能、稳定性和检测精度至关重要。以下是一些主要的技术参数: 一、显示器参数 屏幕尺寸:常见的模具监视器显示器尺寸为12.5英寸至13.5英寸,具体尺寸可能因不同…...
 
使用QGIS配置管线流向地图
一、需求概述 在管网项目中,需要进行地图配置使用QGIS显示管网的流向。 二、目标 配置一副管网地图,可以在地图上显示出每个管段的流向。 三、数据结构 管网数据: id[管线编码]source[起始节点ID]target[终点节点ID]dir[方向]1100101FT2101102FT……………………节点数据…...
白骑士的C#教学附加篇 5.1 C#开发工具
系列目录 上一篇:白骑士的C#教学实战项目篇 4.4 游戏开发 在这一部分,我们将介绍一些额外的内容和工具,以帮助您提高 C# 开发的效率和质量。掌握合适的开发工具和调试技巧,可以让您在编写和维护代码时更加高效和从容。 开发工具对…...
C++中的多线程编程和锁机制
二、多线程、锁 2.1 C语言线程库pthread(POSIX threads) 2.2.1 线程创建 pthread_create #include <pthread.h>pthread_t thread; ThreadData args {1, "Hello from parameterized thread"}; int result pthread_create(&threa…...
 
【投融界-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
 
自动打电话软件给企业带来了什么?
使用机器人外呼系统肯定都是想要给自己企业带来好处和解决问题的,想让自己的企业有所改变,有更好的发展,所以才会选择使用机器人外呼系统。而它也确实没让大家失望,使用了机器人外呼系统之后确实有许多企业发生了很大改变和进步&a…...
 
聚鼎科技:新手做装饰画生意卖什么比较好
在艺术的广阔天地里,装饰画以其独特的魅力逐渐成为室内装饰不可或缺的元素。对于刚入行的新手而言,选择合适的装饰画产品至关重要,它关系到业务的成功与否。以下是一些关于新手做装饰画生意卖什么比较好的建议。 考虑到市场需求的多样性&…...
 
从零开始搭建k8s集群详细步骤
声明:本文仅作为个人记录学习k8s过程的笔记。 节点规划: 两台节点为阿里云ECS云服务器,操作系统为centos7.9,master为2v4GB,node为2v2GB,硬盘空间均为40GB。(节点基础配置不低于2V2GB) 主机名节点ip角色部…...
大模型智能体可以用来实现哪些需求?
大模型智能体可以用来实现广泛的需求,以下是一些常见的应用场景: 自然语言处理(NLP)应用 文本生成:自动撰写文章、编写代码、生成新闻摘要。 对话系统:智能客服、虚拟助手、聊天机器人。 语言翻译…...
Vue 3 组合式 API 全面讲解:defineCustomElement
Vue 3 引入的组合式 API(Composition API)为开发者提供了更加灵活和强大的代码组织能力。除了常用的 defineComponent 用于定义普通组件外,Vue 3 还提供了 defineCustomElement 函数,允许开发者定义可在 Web Components 规范下使用…...
 
SwiftUI 6.0(iOS 18)监听滚动视图视口中子视图可见性的极简方法
概览 在 SwiftUI 的应用开发中,我们有时需要监听滚动视图中子视图当前的显示状态:它们现在是被滚动到可见视口(Viewport)?或仍然是隐藏在“未知的黑暗”中呢? 在 SwiftUI 早期版本中为了得偿所愿,我们需要借助一些“取巧”的手段。不过,从 SwiftUI 6.0(iOS 18)开始情…...
 
分享五种mfc140.dll丢失如何修复?五种修复错误的详细解决办法
在Windows操作系统中,DLL(动态链接库)文件扮演着至关重要的角色,它们为应用程序提供了共享的函数和资源。其中,mfc140.dll是Microsoft Visual C 2015 Redistributable Package的一部分,对于许多使用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)观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中,发生改变的对象称为观察目标,被通知的对象称为观察者&…...
 
华为AR1220配置GRE隧道
1.GRE隧道的配置 GRE隧道的配置过程,包括设置接口IP地址、配置GRE隧道接口和参数、配置静态路由以及测试隧道连通性。GRE隧道作为一种标准协议,支持多协议传输,但不提供加密,并且可能导致CPU资源消耗大和调试复杂等问题。本文采用华为AR1220路由器来示例说明。 配置…...
前端面试题-什么是JavaScript的闭包?有哪些应用场景?
定义: 一个函数能够访问其它函数内部定义的变量 形成的原理: (1)函数创建:在一个函数(外部函数)中定义另一个函数(内部函数)。 (2)内部函数访问:内部函数可以访问和修改外部函数中的局部变量。 (3)函数…...
 
Xilinx XAPP585相关
XAPP585中相关的状态机 第一个状态机:这里主要是在对时钟线延迟的基础上,通过BITSLIP操作,做时钟的对齐; 第二个状态机:这里对c_delay_in所做的操作,主要是对时钟线的延迟进行控制; delay_con…...
 
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
 
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
 
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
 
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
 
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...
 
智警杯备赛--excel模块
数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中,点击确定 这是最终结果,但是由于环境启不了,这里用的是自己的excel,真实的环境中的excel根据实训…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...
 
Java多线程从入门到精通
一、基础概念 1.1 进程与线程 进程是指运行中的程序。 比如我们使用浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。 线程是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某…...
 
HarmonyOS-ArkUI 自定义弹窗
自定义弹窗 自定义弹窗是界面开发中最为常用的一种弹窗写法。在自定义弹窗中, 布局样式完全由您决定,非常灵活。通常会被封装成工具类,以使得APP中所有弹窗具备相同的设计风格。 自定义弹窗具备的能力有 打开弹窗自定义布局,以…...
