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…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
