C语言学习笔记-9
九、结构体
构造类型:
不是基本类型的数据结构也不是指针类型, 它是若干个相同或不同类型的数据构成的集合
结构体类型:
结构体是一种构造类型的数据结构,是一种或多种基本类型或构造类型的数据的集合。
1.结构体类型定义
定义:
(1).先定义结构体类型, 再去定义结构体变量
struct 结构体类型名{
成员列表;
};
struct stu{
int num;
char name[20];
char sex;
};
//有了结构体类型后, 就可以用类型定义变量了
struct stu lucy,bob,lilei;//定义了三个 struct stu 类型的变量,每个变量都有三个成员, 分别是 num name sex
(2).在定义结构体类型的时候顺便定义结构体变量, 以后还可以定义结构体变量
struct 结构体类型名{
成员列表;
}结构体变量 1,变量 2;
struct 结构体类型名 变量 3, 变量 4;
struct stu{
int num;
char name[20];
char sex;
}lucy,bob,lilei;
struct stu xiaohong,xiaoming;
无结构体类型名
在定义结构体类型的时候, 没有结构体类型名, 顺便定义结构体变量,
因为没有类型名, 所以以后不能再定义相关类型的数据了
struct {
成员列表;
}变量 1, 变量 2;
struct {
int num;
char name[20];
char sex;
}lucy,bob;
//以后没法再定义这个结构体类型的数据了, 因为没有类型名
最常用:
通常咱们将一个结构体类型重新起个类型名, 用新的类型名替代原先的类型
typedef struct stu{
int num;
char name[20];
char sex;
}STU;
//以后 STU 就相当于 struct stu
STU lucy;和 struct stu lucy;是等价的。
2.结构体变量的定义初始化及使用
1、 结构体变量的定义和初始化
(1):在定义结构体变量之前首先得有结构体类型, 然后再定义变量
(2):在定义结构体变量的时候, 可以顺便给结构体变量赋初值, 被称为结构体的初始化
(3):结构体变量初始化的时候, 各个成员顺序初始化
struct stu{
int num;
char name[20];
char sex;
};struct stu boy;
struct stu lucy={
101,
"lucy",
'f'
};
//结构体内后面的变量可以不初始化,中间的变量必须初始化
2、 结构体变量的使用
(1).结构体变量成员的引用方法 :结构体变量.成员名
struct stu{
int num;
char name[20];
char sex;
char* addr;
};
struct stu bob;
bob.num=101;//bob 是个结构体变量,但是 bob.num 是个 int 类型的变量
bob.name 是个字符数组,是个字符数组的名字,代表字符数组的地址,是个常量
//bob.name ="bob";是不可行,是个常量
strcpy(bob.name,"bob");strcpy(bob.addr,"beijing")//错误,bob.addr是个野指针
bob.addr="beijing";//正确
#include <stdio.h>
struct stu{
int num;
char name[20];
int score;
char *addr;
};
int main(int argc, char *argv[])
{
struct stu bob;
printf("%d\n",sizeof(bob));
printf("%d\n",sizeof(bob.name));
printf("%d\n",sizeof(bob.addr));
return 0;
}
//结构体大小,为各元素的大小之和
3、相同类型的结构体变量相互赋值
#include <stdio.h>
struct stu{
int num;
char name[20];
char sex;
};int main(int argc, char *argv[])
{
struct stu bob={101,"bob",'m'};
struct stu lilei;
lilei=bob;//类型相同
printf("%d %s %c\n",lilei.num,lilei.name,lilei.sex);
return 0;
}
3.结构体数组
结构体数组是个数组, 由若干个相同类型的结构体变量构成的集合
1、结构体数组的定义方法
struct 结构体类型名 数组名[元素个数];
struct stu{
int num;
char name[20];
char sex;
};
struct stu edu[3];//定义了一个 struct stu 类型的结构体数组 edu,
这个数组有3个元素分别是 edu[0]、 edu[1]、edu[2]
结构体数组元素的引用: 数组名[下标]
数组元素的使用
edu[0].num =101;//用 101 给 edu 数组的第 0 个结构体变量的 num 赋值
strcpy(edu[1].name,"lucy");
#include <stdio.h>
typedef struct student
{
int num;
char name[20];
float score;
}STU;
STU edu[3]={
{101,"Lucy",78},
{102,"Bob",59.5},
{103,"Tom",85}
};
int main()
{
int i;
float sum=0;
for(i=0;i<3;i++)
{sum+=edu[i].score;}
printf("平均成绩为%f\n",sum/3);
return 0;
}
4.结构体指针
即结构体的地址, 结构体变量存放内存中, 也有起始地址。咱们定义一个变量来存放这个地址, 那这个变量就是结构体指针变量。
结构体指针变量也是个指针, 既然是指针在 32 位环境下, 指针变量的占 4 个字节, 存放一个地址编号。
1、 结构体指针变量的定义方法:
struct 结构体类型名 * 结构体指针变量名;
struct stu{
int num;
char name[20];
};
struct stu * p;//定义了一个 struct stu *类型的指针变量
//变量名是p,p占4个字节,用来保存结构体变量的地址编号
struct stu boy;
p=&boy;boy.num=101;//可以,通过 结构体变量名.成员名
(*p).num=101;//可以,*p 相当于 p 指向的变量 boy
p->num=101;//可以,指针->成员名
//通过结构体指针来引用指针指向的结构体的成员, 前提是指针必须先指向一个结构体变量。
2、应用场景
(1): 保存结构体变量的地址
typedef struct stu{
int num;
char name[20];
float score;
}STU;int main()
{
STU *p,lucy;
p=&lucy;
p->num=101;
strcpy(p->name,"baby");
//p->name="baby";//错误,因为 p->name 相当于 lucy.name 是个字符数组的名字,是个常量
}
(2): 函数传结构体变量的地址
#include<stdio.h>
#include<string.h>
typedef struct stu{
int num;
char name[20];
float score;
}STU;
void fun(STU *p)
{
p->num=101;
(*p).score=87.6;
strcpy(p->name,"lucy");
} int main()
{
STU girl;
fun(&girl);
printf("%d %s %f\n",girl.num,girl.name,girl.score);
return 0;
}
(3): 传结构体数组的地址
结构体数组, 是由若干个相同类型的结构体变量构成的集合。 存放在内存里,
也有起始地址, 其实就是第 0 个结构体变量的地址。
#include<stdio.h>
#include<string.h>
typedef struct stu{
int num;
char name[20];
float score;
}STU;
void fun(STU *p)
{
p[1].num=101;
(*(p+1)).score=88.6;
}
int main()
{
STU edu[3];
fun(edu);
printf("%d %f\n",edu[1].num,edu[1].score);
return 0;
}
注意:
(1): 结构体变量的地址编号和结构体第一个成员的地址编号相同, 但指针的类型不同
#include <stdio.h>
typedef struct stu{
int num;
char name[20];
int score;
}STU;
int main(int argc, char *argv[])
{
STU bob;
printf("%p\n",&bob);//STU*
printf("%p\n",&(bob.num));//int*
return 0;
}
(2): 结构体数组的地址就是结构体数组中第 0 个元素的地址
#include <stdio.h>
struct stu{
int num;
char name[20];
int score;
};int main(int argc, char *argv[])
{
struct stu edu[3];
printf("%p\n",edu);//struct stu *
printf("%p\n",&(edu[0]));//struct stu *
printf("%p\n",&(edu[0].num));//int *
return 0;
}//各地址相同
5.结构体内存分配
规则 1: 以多少个字节为单位开辟内存
(1): 成员中只有 char 型数据 , 以 1 字节为单位开辟内存。
(2): 成员中出现了 short int 类型数据, 没有更大字节数的基本类型数据。以 2 字节为单位开辟内存
(3): 出现了 int ,float 没有更大字节的基本类型数据的时候以 4 字节为单位开辟内存。
(4): 出现了 double 类型的数据
情况 1:
在 vc6.0 和 Visual Studio 中里, 以 8 字节为单位开辟内存。
情况 2:
在 Linux 环境 gcc 里, 以 4 字节为单位开辟内存。
无论是那种环境, double 型变量, 占 8 字节。
(5):如果出现指针的话, 没有占字节数更大的类型的, 以 4 字节为单位开辟内存。
struct stu{
char sex;
int age;
}lucy;
//lucy 的大小是 4 的倍数。
规则 2: 字节对齐
(1): char 1 字节对齐 , 即存放 char 型的变量, 内存单元的编号是 1 的倍数即可。
(2): short int 2 字节对齐 , 即存放 short int 型的变量, 起始内存单元的编号是 2 的倍数即可。
(3): int 4 字节对齐 , 即存放 int 型的变量, 起始内存单元的编号是 4 的倍数即可
(4): long int 在 32 位平台下,4 字节对齐,即存放 long int 型的变量, 起始内存单元的编号是 4
的倍数即可
(5): float 4 字节对齐 , 即存放 float 型的变量, 起始内存单元的编号是 4 的倍数即可
(6): double
vc6.0 和 Visual Studio 环境下
8 字节对齐, 即存放 double 型变量的起始地址, 必须是 8 的倍数, double 变量占 8 字节
gcc 环境下
4 字节对齐, 即存放 double 型变量的起始地址, 必须是 4 的倍数, double 变量占 8 字节。
注意 3: 当结构体成员中出现数组的时候, 可以看成多个变量。
注意 4: 开辟内存的时候, 从上向下依次按成员在结构体中的位置顺序开辟空间
#include<stdio.h>
struct stu{
char a;
short int b;
int c;
}temp;
int main()
{
printf("%d\n",sizeof(temp));
printf("%p\n",&(temp.a));
printf("%p\n",&(temp.b));
printf("%p\n",&(temp.c));
return 0;
}
结果分析:
a 的地址和 b 的地址差 2 个字节
b 的地址和 c 的地址差 2 个字节
#include<stdio.h>
struct stu{
char a;
int c;
short int b;
}temp;
int main()
{
printf("%d\n",sizeof(temp));
printf("%p\n",&(temp.a));
printf("%p\n",&(temp.b));
printf("%p\n",&(temp.c));
return 0;
}
结果分析:
a 和 c 的地址差 4 个字节
c 和 b 的地址差 4 个字节
struct stu{
char buf[10];
int a;
}temp;
//temp 占 16 个字节
在 vc 和 Visual Studio 中占 16 个字节 a 和 b 的地址差 8 个字节
在 gcc 中占 12 个字节 a 和 b 的地址差 4 个字节
#include<stdio.h>
struct stu{
char a;
double b;
}temp;
int main()
{
printf("%d\n",sizeof(temp));
printf("%p\n",&(temp.a));
printf("%p\n",&(temp.b));
return 0;
}
相关文章:
C语言学习笔记-9
九、结构体 构造类型: 不是基本类型的数据结构也不是指针类型, 它是若干个相同或不同类型的数据构成的集合 结构体类型: 结构体是一种构造类型的数据结构,是一种或多种基本类型或构造类型的数据的集合。 1.结构体类型定义 定…...
LLM 部署(1)——LLM 部署框架对比
1 Ollama 一个专注于简化大型语言模型(LLM)在本地部署和运行的开源框架。 简化部署:Ollama使用Docker容器技术来简化LLM的部署过程 捆绑模型组件:Ollama将模型权重、配置和数据捆绑到一个包中,称为Modelfile…...
Qt坐标体系,控件坐标的设置
Qt窗口坐标体系---平面直角坐标系(笛卡尔坐标系) 以左上角为0,0坐标原点 给Qt的某个控件,设置位置,就需要指定坐标,对应这个控件来说,坐标系原点就是相对于父控件的 如: QPushButt…...
大数据系列之:Kerberos
大数据系列之:Kerberos 基本概念工作流程安全特性应用场景总结加密原理Kerberos认证流程更改您的密码授予账户访问权限票证管理Kerberos 票据属性使用 kinit 获取票据使用 klist 查看票据使用 kdestroy 销毁票据.k5identity 文件描述 Kerberos 是一种网络认证协议&a…...
【力扣hot100题】(059)单词搜索
这道题给我最大的启示就是不要什么时候都用哈希表,偶尔也要用用数组…… 是这样,一开始还沾沾自喜的以为知道了哈希表的自己一定可以比以前傻傻用数组的我要节省空间,结果发现哈希表不能存储pair用编号存储会时间超限用数组只需要7*7的空间。…...
Java全栈面试宝典:锁机制与Spring生命周期深度解析
目录 一、synchronized锁状态机全解析 🔥 问题5:synchronized四态转换与性能对比 锁状态转换流程图 锁特性对比表 CAS操作示例 二、ReentrantLock与synchronized深度对比 🔥 问题6:两大锁机制对比 核心差异矩阵 生产级Re…...
15分钟完成Odoo18.0安装与基本配置
序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo18发行已半年有余,不少企业也已上至生产环境进行使用了。今天我们来看看 Odoo18的安装。 本次安装我们介绍通过阿里云服务器安装Odoo18社区版。 1.服务器准备 1.1操作系统 操作系统使用ubuntu22.04ÿ…...
pom导包成功,但是就是无法使用相关类,同时报错:Library:Maven ‘xxx‘ has broken path
开发环境:Intellij 2023 一、问题记录 在maven工程的pom文件导入如下某一依赖(JGit)。没有显示导包的错误,同时在maven仓库里面找到对应的包是正常下载到相应jar的。 但是就是无法引入相关的类。打开Project Structure,在Dependencies中发现…...
Cocos Creator 进行 Web 发布后,目录结构解析
在使用 Cocos Creator 进行 Web 发布后,生成的目录结构通常包含以下内容,下面为你详细介绍: 1. index.html 这是 Web 项目的入口 HTML 文件,它会加载所需的 JavaScript 文件和资源,从而启动游戏或应用程序。示例代码…...
Linux-磁盘管理
文章目录 1、查看磁盘和文件(夹)使用情况2、磁盘分区1)查看分区情况2)MBR分区3)GPT分区 3、磁盘分区格式化4、磁盘挂载1)挂载2)卸载挂载点3)永久挂载 1、查看磁盘和文件(…...
P1149 [NOIP 2008 提高组] 火柴棒等式(DFS)
题目描述 给你 n 根火柴棍,你可以拼出多少个形如 ABC 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。用火柴棍拼数字 0∼9 的拼法如图所示: 注意: 加号与等号…...
机器学习新范式:Kubernetes + Kubeflow,解锁模型训练与部署的高效密码
一、Kubernetes在机器学习模型训练与部署中的作用 Kubernetes作为一个强大的容器编排平台,为机器学习模型的训练与部署提供了以下核心支持: 分布式训练支持:Kubernetes能够自动化部署和管理PyTorch等机器学习框架的分布式训练任务。通过利用…...
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡 直接修改苹果IPA包的签名和打包信息并不是一个推荐的常规做法,因为这可能违反苹果的开发者条款,并且可能导致…...
SpringSecurity框架入门
简介 官网 Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。它支持多种…...
AIDD-人工智能药物设计-双扩散模型结合多目标优化策略助力3D小分子药物设计
Adv. Sci. | 双扩散模型结合多目标优化策略助力3D小分子药物设计 药物发现中,如何精准且高效地设计具有理想物理化学性质的潜在药物分子,对当前的研究水平来说仍然是一项重大挑战。近年来,基于深度学习的全新分子生成(de novo molecular generation)方法取得了显著进展,…...
Python面向对象编程 - 接口隔离原则(ISP)
1. 原则定义 接口隔离原则(Interface Segregation Principle, ISP) 是SOLID原则中的"I",核心思想是: 客户端不应该被迫依赖它们不使用的接口 即:多个特定功能的接口比一个通用接口更好 2. 核心思想 将臃肿的接口拆分为更小、更具…...
mac安装浏览器闪退处理
安装 Chrome或edge后打开浏览器出现闪退,是因为权限不够。 以下是针对edge的处理方法。 sudo chown -R $(whoami) ~/Library/Application\ Support/Microsoft\ Edge sudo chmod -R 755 ~/Library/Application\ Support/Microsoft\ Edge 原因分析: 在…...
408 计算机网络 知识点记忆(5)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...
Java面试黄金宝典38
1. TIME_WAIT 和 CLOSE_WAIT 的区别 定义 TIME_WAIT:是主动发起关闭连接操作的一方,在发送最后一个 ACK 确认包之后进入的状态。此状态存在的意义在于确保对端能收到最后一个 ACK 包,同时让网络中可能残留的旧数据包自然消逝,防止其干扰后续相同四元组(源 IP、源端口、目…...
【算法】筛质数
目录 埃氏筛法算法原理代码 欧拉筛法算法原理代码 埃氏筛法 算法原理 算法思想就像"筛子"一样,把合数筛掉,剩下的就是质数: 从2开始,依次检查每个数如果当前数未被标记为合数,它就是质数然后把这个质数的…...
【IDEA】✈️自定义模板,自动生成类和方法注释
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时三分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&a…...
笔试专题(六)
文章目录 最长无重复子数组(滑动窗口)题解代码 重排字符串(贪心 构造)题解代码 牛牛冲钻五(模拟)题解代码 最长无重复子数组(滑动窗口) 题目链接 题解 1. 滑动窗口 2. 什么时候…...
【算法实践】跳跃游戏——计算到达终点的最小跳数
问题描述 给定一个非负数数组 arr[],每个元素表示从该位置最多可向前跳跃的步数。 示例: 若 arr[i] 3,则可以从位置 i 跳跃到 i1、i2 或 i3。若 arr[i] 0,则无法从该位置向前跳跃。 任务:找到从数组第一个位置移动…...
sklearn的Pipeline
Pipeline类 介绍:Pipeline 可以将多个数据处理步骤和机器学习模型组合成一个序列,其中每个步骤都是一个变换器(Transformer)或者估计器(Estimator),并且Pipeline中的最后一个必须为估计器,其它的必须为变换器,如果Pipeline中的估计器为为分类器则整个Pipeline就作为分…...
Unity3D仿星露谷物语开发34之单击Drop项目
1、目标 当在道具栏中选中一个Item时,点击地面就可以实现Item的drop操作,每点击一次就drop一次,直到道具栏中Item数量不够。 这样的好处:避免每次Drop都从道具栏中拖拉Item,通过点击这种操作可以更加高效。 方法&am…...
每日一题(小白)回溯篇4
深度优先搜索题:找到最长的路径,计算这样的路径有多少条(使用回溯) 分析题意可以得知,每次向前后左右走一步,直至走完16步就算一条走通路径。要求条件是不能超出4*4的范围,不能重复之前的路径。…...
Day16——路由2
路由独有的两个生命周期钩子 作用:用于捕获路由组件的激活状态 具体名字: activated 路由组件被激活时触发 deactivated 路由组件失活时触发 现在在缓存路由组件的基础上,想要使h2中的文字透明度不断变化,在切换到别的组件时销毁控制文字不…...
iproute2 工具集使用详解
目录 一、iproute2 核心命令:ip二、常用功能详解1. 管理网络接口(link 对象)2. 管理 IP 地址(address 对象)3. 管理路由表(route 对象)4. 管理 ARP 和邻居缓存(neigh 对象࿰…...
C++学习之套接字并发服务器
目录 1.昨天套接字服务器的弊端 2.如何通过多进程方式实现服务器并发 3.多进程服务器-1 4.多进程服务器-2 5.多进程版程序-回收子进程被信号中断的处理 6.多线程版TCP服务处理思路 7.多线程并发服务器编写 8.为什么不能把文件描述符地址传到子线程中 9.多线程程序测试 …...
MCP项目开发-一个简单的RAG示例
MCP项目开发-一个简单的RAG示例 前言 前言 客户端是基于官网的例子改的,模型改成了openai库连接仅仅使用基础的RAG流程作为一个演示,包含了以下步骤 query改写搜索:使用google serper重排序:使用硅基流动的api 大模型api也使用…...
Windows安装ssh服务
使用管理员权限打开Windows PowerShell Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0启动服务 Start-Service sshd 设置开机自启 Set-Service sshd -StartupType Automatic允许22端口 New-NetFirewallRule -Name “SSH” -DisplayName “SSH” -Enabled Tr…...
从零实现本地大模型RAG部署
1. RAG概念 RAG(Retrieval-Augmented Generation)即检索增强生成,是一种结合信息检索与大型语言模型(大模型)的技术。从外部知识库(如文档、数据库或网页)中实时检索相关信息,并将其…...
什么是ThreadLocal
ThreadLocal 是 Java 提供的一个工具类,它为每一个使用该变量的线程都提供了一个独立的变量副本。换句话说:每个线程都有自己的本地变量副本、互不干扰。它不是用来共享数据的,而是用来隔离数据的。 一、为什么需要 ThreadLocal?…...
MySQL-SQL-DQL语句、DQL基本查询、DQL条件查询、DQL分组查询、聚合函数、DQL排序查询、DQL分页查询
一. DQL DQL:Data Query Language(数据查询语言),用来查询数据库表中的记录。 关键字:SELETE -- DQL 完整语法select字段列表 from表名列表 where条件列表 group by分组字段列表 having分组后条件列表 order by排序字段列表 limit分页参数 …...
vue2 vue3 响应式差异
vue2 响应式原理看这 链接: link 总结: object.defineproperty()是对属性的劫持,对属性劫持有两大缺陷 1. 需要遍历对象的所有属性,深层属性需递归,存在效率问题 2. 后添加的属性,无法获得响应式,因为劫持…...
常见NLP模型发展脉络:从传统方法到大语言模型
自然语言处理作为人工智能领域的重要分支,经历了从传统统计方法到深度学习的巨大飞跃。本文将带你梳理NLP模型的发展脉络,回顾那些推动技术进步的重要里程碑。 一、统计学习阶段(1990s-2010s初) 早期的NLP模型主要基于统计方法&…...
Bert论文解析
文章目录 BERT:用于语言理解的深度双向转换器的预训练一、摘要三、BERT介绍BERT及其详细实现答疑:为什么没有标注的数据可以用来预训练模型?1. 掩码语言模型(Masked Language Model, MLM)2. 下一句预测(Nex…...
【数学】勒让德定理(legendres-formula)详解
勒让德定理(Legendre’s Formula)详解 这段代码使用的数学原理是勒让德定理,它是计算质数p在n!的质因数分解中指数的核心方法。 一、定理内容 对于任意质数p和正整数n,p在n!的质因数分解中的指数(即n!能被p整除的最…...
时空联合规划算法
本文主要讲解时空时空联合规划算法。 文章目录 前言一、时空联合规划基本概念1.1 EM Planner算法求解过程1.2 时空联合规划算法求解过程二、基于搜索的规划方法2.1 构建三维时空联合规划地图2.2 基于Hybrid A*的时空联合规划二、基于迭代搜索的规划方法2.1 这段时间更新中2.2 这…...
如何在idea中新建一个项目
Java通常展现的方式就是项目,但是在不熟悉idea的情况下,我们应该如何创建一个项目呢? 第一步:点击File-->New-->Project 第二步:选择 Empty Project 第三步:点击File-->找到Project Structure--&…...
设计模式简述(十三)适配器模式
适配器模式 描述基本使用使用关于适配器关联不兼容类的方式如果原有抽象层是抽象类若原有抽象是接口使用 描述 适配器模式常用于系统已经上限稳定运行,但现有需求需要将两个不匹配的类放到一起工作时使用。 也就是说这是一个迭代阶段使用的模式。 这种模式&#x…...
功耗日志抓取需求
最近罗列了一些功耗分析需要的常见日志: 测试功耗前: adb shell dumpsys batterystats --reset adb shell dumpsys batterystats --enable full-wake-history 测试功耗后,使用脚本导出如下功耗日志: 脚本 chmod x collect_logs.s…...
设计模式简述(十一)装饰器模式
装饰器模式 描述基本使用使用 描述 装饰器模式是一种功能型模式 用于动态增强对象的功能 这么一说感觉上和代理模式有些类似 抽象装饰器 要实现原有业务接口,并注入原有业务对象 至于对原有业务对象的调用,可以采用private业务对象 实现业务接口方法的…...
MongoDB基础知识
MongoDB基础知识 目录 基础篇 一、MongoDB入门指南(零基础必读)二、MongoDB简介三、MongoDB安装与配置四、MongoDB基本操作五、MongoDB查询操作 进阶篇 六、MongoDB索引七、MongoDB聚合操作八、MongoDB数据模型九、MongoDB安全十、MongoDB备份恢复十一…...
Kubernetes详细教程(一):入门、架构及基本概念
Kubernetes(常简称为K8s)是一个开源的平台,用于自动化部署、扩展和管理容器化应用程序。 官方文档:https://kubernetes.io/zh-cn/docs/concepts/overview/components/ 一、入门 (一)Kubernetes是什么&am…...
架构思维:限流技术深度解析
文章目录 Pre业务场景熔断 VS 限流4大限流算法固定时间窗口计数滑动时间窗口计数漏桶令牌桶 方案实现使用令牌桶还是漏桶模式?在 Nginx 中实现限流还是在网关层中实现限流?使用分布式限流还是单机限流?使用哪个开源技术? 限流方案…...
批量改CAD图层颜色——CAD c#二次开发
一个文件夹下大量图纸(几百甚至几千个文件)需要改图层颜色时,可采用插件实现,效果如下: 转换前: 转换后: 使用方式如下:netload加载此dll插件,输入xx运行。 附部分代码如…...
vue猜词游戏
说明:我希望用vue实现猜词游戏 Vue Wordle 游戏规则总结 核心规则 单词选择 目标单词从预设词库(DEFAULT_WORDS)中随机选取,均为5字母单词(如apple、zebra等)。 输入要求 长度限制:必须…...
SQL ②-库操作 | 数据类型
这里是Themberfue SQL语法 数据库术语 DATABASE:数据库,保存有组织的数据的容器(通常是一个文件或一组文件)。TABLE:表,某种特定类型数据的结构化清单。SCHEMA:模式,关于数据库和表…...
云轴科技ZStack CTO王为@中国GenAI大会:AI原生实践重构AI Infra新范式
4月1-2日,2025中国生成式AI大会(GenAICon 2025)在北京举办,该会议已成为国内AI领域最具影响力的产业峰会之一。来自学术界与产业界的50位嘉宾围绕GenAI应用、大模型、AI智能体、具身智能、DeepSeek R1与推理模型等话题,…...