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

进阶 pro max

最近搞了许多有趣的东西,比如自制rtos,速成数模电,学了一点点的AD,看着视频弄了HAL库,以及定时器和串口中断配合实现接收任意长度(不超过缓冲值)数据,还有配置hal库的freertos+fafts ,今天到货了前两天买的硬件十万个为什么,又下单了H750VB板子,这两天过敏又犯了, 无语,一字难受。

总结一下大二暑假学的东西   

定时器判断长短按
定时器和串口判断一帧数据
bootloader
三极管,mos管
防反接电路
dcdc电源原理,ldo,电容滤波原理
元器件的认识,磁珠电感电容电阻各种二极管
esp8266获取天气
C语言结构体,常用函数,关键字指针等知识点总结。
手写i2c读rom,学习spi读写flash和sd卡
做完辅助穿衣机器人的程序
嘉立创画完温湿度检测的板子
keil调试方法
hal库的使用
can
步进电机
一点点的AD

在此更新一些C语言杂乱知识点和疑难杂症........


函数指针和指针函数

函数指针

本质是指针,指向一个函数 。

qsort

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));// base  -> 需要排序的数组的起始地址
// num   -> 数组内元素的个数(数组的大小)
// size  -> 一个元素的大小(单位是字节)
// int (*compar)(const void*,const void*)   -> compar(一个函数指针),类型是 int (*)(const void*,const void*)

c - qsort函数使用方法总结(详细全面+代码) - 个人文章 - SegmentFault 思否icon-default.png?t=N7T8https://segmentfault.com/a/1190000038746268指针函数和函数指针_指针函数 函数指针-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/u010280075/article/details/88914424?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172407382416800182122635%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172407382416800182122635&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~top_positive~default-1-88914424-null-null.nonecase&utm_term=%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88&spm=1018.2226.3001.4450C语言---qsort 函数详解与实现(快速排序任何类型)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/2302_78684687/article/details/137467421

大家也都能了解,这个函数的重点就在于 compar 这一函数指针。

问题是怎么使用qsort来对一个数组进行排序 ,上面是对qsort四个参数的介绍,其中数组起始地址就是数组名(这点在上一篇文章中指针和数组的关系中讲过,江科大的指针视频中也提到过)。

后面是数组的元素个数和每个元素的大小

char shuzu[]={1,2,3,4,5,6,77,8}
//数组元素个数
sizeof(shuzu) / sizeof(char) ;
//每个元素的字节大小
sizeof(shuzu[0]);

sizeof(char) 和 sizeof(shuzu[0]) 是一样的。

最最重点的就是第四个参数是一个函数,函数名可以自由定义,但是参数必须和qsort给的如出一辙,即为

char sum_int(const void* p1, const void* p2)
{
//	return (int)(*(int*)p1 - *(int*)p2);    //->升序return (int)(*(char *)p2 - *(char*)p1);    //->降序
}

qsort函数根据函数指针所指向的函数的返回值和 0的关系做出判断从而进行排序,所以至于是从大到小还是从小到达,可以自己决定。

在 sum_int() 函数中需要将参数p1和p2转义为数组的定义类型。p1p2是指针,数值等于地址 。所以(char*)的转义符前面还有一个*,代表p1p2所指向地址的数值 。

最近看的回调函数也和函数指针相关。

指针函数

本质是函数,返回一个指针 。返回指针的函数叫指针函数

#include <stdio.h>
#include <stdlib.h>
char  *get_num ( char *n,const char *m);
int main()
{char a1[100]= "hello";char a2[]= "world";printf("%s", get_num(a1,a2));
}char *get_num ( char *n,const char *m)
{char *p=n;while(*n != '\0') { n++; }while(*m != '\0') { *n++ = *m++ ;} *n = '\0';return p;
}

结果为helloworld

定义 函数  get_num()实现字符串的拼接并返回拼接好的字符串的起始地址。

原来pritf函数打印字符串的时候输入字符串的地址就行,比如 

 char a2[]= "world";printf("%s", a2);

a2 是数组名 ,也就是数组地址 。

在 函数  get_num() 内部用循环将指针 n 指向到数组 n 的末尾 ,之后从数组 a 的末尾开始用循环取m的值一位一位的的赋值给n指导数组m结束,实现字符串的拼接。


浮点数在内存中的存储

C语言---浮点数在内存中的存储_c浮点数存储-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/2302_80826557/article/details/137436685?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172407546616800172520370%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172407546616800172520370&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduend~default-1-137436685-null-null.nonecase&utm_term=%E6%B5%AE%E7%82%B9%E6%95%B0%E5%9C%A8%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84%E5%AD%98%E5%82%A8&spm=1018.2226.3001.4450在浮点数进行判断的时候,在浮点数后边加一个f

如下图所示

int main()
{float f1=2.2;if(f1 == 2.2)  printf("2.2 = 2.2\r\n");else  printf("no xiangdeng\r\n");if(f1 == 2.2f)  printf("2.2f = 2.2f\r\n");else  printf("no xiangdeng\r\n");	}

可见,对f1进行判断的时候加一个f才能输出正确的结果。


安规电容

安规电容在电路中用于过滤干扰信号,X电容用于抑制差模干扰,Y电容用于抑制共模干扰 。


数组与指针

对于以下代码,猜猜在存储区一共存储了几个 hello

#include <stdio.h>
#include <stdlib.h>int main()
{char *s1="hello";char *s2="hello";char a1[]="hello";char a2[]="hello";printf("%p %p %p %p",s1,s2,a1,a2);}

其中 *s1 指向的 hello 是一个字符串常量,在静态存储区(静态存储区直到执行结束内存才被回收),s1和s2指向的内容一样所以地址一样。

a1 和 a2是局部变量,放在栈里可以随时修改,所以a1和a2是两个不一样的hello,总的来说看来是变量存储的位置不同从而带来的影响。

a1代表的是数组名也就是数组的地址是地址常量存储在静态存储区,地址常量不能被修改。也就是说 a1++;是错误的,地址上面的数值可以修改,比如 *a1[0] = 'H';是对的。 

s1是一个指针,指针是可以变的,指向的是hello的地址,也可以变成其他字符串的地址。 所以 s1++;是合法的,再次打印 *s1 得到的结果为 "ello" ,字符串常量hello是不能被修改的,比如

*s1[0] = 'H' 会报错。

其中指针和数组占用的内存也不一样。

数组占用的内存为字符个数乘以变量类型字节长度。

指针大小为系统位数除以8 。


二维数组

数据结构 | 二维数组的元素地址。【按行或按列存储】时,行列对换坐标,元素的起始地址保持不变-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_52700125/article/details/134883240?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172407755216800184153816%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172407755216800184153816&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduend~default-2-134883240-null-null.nonecase&utm_term=%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E5%85%83%E7%B4%A0%E7%9A%84%E5%9C%B0%E5%9D%80&spm=1018.2226.3001.4450

元素的地址等于起始地址加上元素在数组中排在元素前面的所有元素所占的内存大小。对于二维数组分为行和列。比如数组定义为a[2][4],那么a[1][1]前面的元素包括a[0][1],a[0][2],a[0][3],a[0][4] 。

二维数组如何进行传参

#include <stdio.h>
#include <stdlib.h>
int get_num(int n,int m,int (*p)[m]);
int main()
{
int a[3][3]={{1,4,7},{3,7,1},{9,4,2}};
int sum ;sum = get_num(3,3,a);
printf("%d\n",sum);
return 0;}数组指针 int (*p)[m]
(*p)代表数组名,[m],代表他每一行有m个列。int get_num (int n,int m,int (*p)[m])
{int sum = 0;int i,j;for(i=0;i<n;i++){for(int j=0;j<m;j++){sum += p[i][j];printf("%d\r\n",*(*(p+i)+j)); //先找行再找列,再取值}	}return sum;	
}

运行结果


指针常量和常量指针

常量指针(本质是指针) 指针指向的地址的内容不能被改变 (可以更改指针指向的地址来改变指针对应的数值)    指向常量的指针 。

指针常量(本质是常量) 指针指向的内容的地址不能被改变 (可以更改指针指向的内容来改变指针对应的数值)    指针本身是个常量 。

常量指针和指针常量的区别_指针常量和常量指针的区别-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_46280821/article/details/126652869?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172407987416800213061084%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172407987416800213061084&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~top_positive~default-1-126652869-null-null.nonecase&utm_term=%E5%B8%B8%E9%87%8F%E6%8C%87%E9%92%88%E5%92%8C%E6%8C%87%E9%92%88%E5%B8%B8%E9%87%8F&spm=1018.2226.3001.4450


数组指针和指针数组

数组指针与指针数组的区别_数组指针和指针数组的区别-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/super_demo/article/details/19679053?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172408134016800222843329%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172408134016800222843329&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduend~default-2-19679053-null-null.nonecase&utm_term=%E6%95%B0%E5%80%BC%E6%8C%87%E9%92%88%E5%92%8C%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84&spm=1018.2226.3001.4450数组指针    指向一个数组的指针

数组指针经常和二维数组连用。

链表

手撕链表

数据结构之手撕链表(讲解➕源代码)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/2302_76941579/article/details/133846023?ops_request_misc=%257B%2522request%255Fid%2522%253A%25225ECE9487-2A28-4479-852E-93DC3E8A40C1%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=5ECE9487-2A28-4479-852E-93DC3E8A40C1&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-133846023-null-null.142^v100^pc_search_result_base9&utm_term=%E6%89%8B%E6%92%95%E9%93%BE%E8%A1%A8&spm=1018.2226.3001.4187

#include <stdio.h>typedef int datatype;//定义结构体
/*您提供的代码片段是一个C语言中的结构体定义,使用了`typedef`关键字来
定义一个结构体类型`listnode`和一个指向该结构体的指针类型`linklist`。
这种定义方式在数据结构中常用,特别是在处理链表时,可以简化代码中的类型
声明。结构体`listnode`包含两个成员:一个整型数据`data`和一个指向下一个
`listnode`结构体的指针`next`。通过`typedef`关键字,`listnode`成为
了结构体类型的别名,而`linklist`成为了指向该结构体的指针类型的别名。
这样,在后续的代码中,可以直接使用`listnode`和`linklist`来声明变量,
而不需要每次都写出完整的结构体类型和指针类型。这种定义方式在C语言中是合法的,并且是一种常见的编程技巧,
用于提高代码的可读性和可维护性.*/typedef struct node{
int data;
struct node *next;
}listnode,*linklist;linklist list_create();//列表创建函数
int head_insert(linklist H,datatype data);//列表头部插入函数 
int list_show(linklist H);//列表遍历打印函数int main(){linklist H;if ((H = list_create()) ==NULL ){ return 0;}	head_insert(H, 50);head_insert(H, 50);head_insert(H, 100);head_insert(H, 20);head_insert(H, 50);list_show(H);return 0;		
}linklist list_create()
{linklist H;if((H = (linklist)malloc(sizeof(listnode))) == NULL){return H;}	H->data = 0;H->next = NULL;return H;	
}
//没有释放掉申请的内存,需要注意
int head_insert(linklist H,datatype data)
{   linklist p;if(H == NULL) {return -1;}if((p = (linklist)malloc(sizeof(listnode))) == NULL){ printf("malloc failed");return -1;}p->data = data;p->next = H ->next;H->next = p;return 0;
}int list_show(linklist H)
{if(H == NULL || H ->next == NULL){return -1;}H = H->next;while(H != NULL){//最后一个链表节点的指针为NULLprintf("%d\r\n",H->data);H = H->next;}printf("\n");return 0;
}

实验现象


对结构体指针指向的字符串进行修改的放法

指针与字符串-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_43680827/article/details/122929776?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172416196116800182767696%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=172416196116800182767696&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-122929776-null-null.142%5Ev100%5Epc_search_result_base9&utm_term=%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%92%8C%E6%8C%87%E9%92%88&spm=1018.2226.3001.4187直接对指针定义结构体,指针指向的是存放在静态存储区的字符串的地址,

对结构体指针指向的字符串直接进行修改失败的原因也是静态存储区的常量不能被修改

比如 s1.name[0] = 'H' ;  是错误的 。 

自己申请一段堆上的空间

并不是实现对精彩存储区常量的修改,而是实现了申请内存的方法修改结构体指针指向的存在堆区的字符串的内容。所以结构体指针指向的字符串还是不能直接定义,需要用其他方法,原因还是直接定义就是定义静态常量不能修改。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N   50struct student{int num;char *name;	
};int main(){
struct student s1 ={1,"guangtouqiang"};	
struct student s2;
s2.num = 2;//s1.name[0] = 'G';if((s2.name = malloc(N*sizeof(char))) == NULL) { return 0;}//s2.name = "xiongda";
strcpy(s2.name,"xiongda");
s2.name[0] = 'X';printf("%d   %s\r\n",s1.num,s1.name);
printf("%d   %s\r\n",s2.num,s2.name);free(s2.name);
s2.name == NULL;		
}

相关文章:

进阶 pro max

最近搞了许多有趣的东西&#xff0c;比如自制rtos&#xff0c;速成数模电&#xff0c;学了一点点的AD&#xff0c;看着视频弄了HAL库&#xff0c;以及定时器和串口中断配合实现接收任意长度&#xff08;不超过缓冲值&#xff09;数据&#xff0c;还有配置hal库的freertosfafts …...

Agentic Security:一款针对LLM模型的模糊测试与安全检测工具

关于Agentic Security Agentic Security是一款针对LLM模型的模糊测试与安全检测工具&#xff0c;该工具可以帮助广大研究人员针对任意LLM执行全面的安全分析与测试。 请注意 Agentic Security 是作为安全扫描工具设计的&#xff0c;而不是万无一失的解决方案。它无法保证完全防…...

Spring Cloud Config 与 Spring Cloud Bus 来实现动态配置文件

要使用 Spring Cloud Config 与 Spring Cloud Bus 来实现动态配置文件&#xff0c;你可以按照以下步骤操作&#xff1a; ### 步骤 1: 添加依赖 首先&#xff0c;确保你的项目中添加了 Spring Cloud Config 客户端和 Bus 的依赖。对于 Maven 项目&#xff0c;pom.xml 文件应该…...

Qt:Qt背景

目录 1.Qt解释 2.Windows下开发GUI的方案 3.框架 4.Qt历史 4.Qt支持的平台 5.Qt版本 6.Qt案例 1.Qt解释 前端开发&#xff0c;分为网页前端开发&#xff08;Web)、桌面应用开发&#xff08;Windows、Linux&#xff09;、移动应用开发&#xff08;Android&#xff09;。Q…...

【数据结构】选择排序

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes &#x1f3c0;OJ题分享&#xff1a; Topic Sharing 目录 前言&#xff1a; 基本思想 直接选择排序 思路分…...

国产GD32单片机开发入门(二)GD32单片机详解

文章目录 一.概要二.单片机型号命名规则三.GD32F103系统架构四.GD32F103C8T6单片机启动流程五.GD32F103C8T6单片机主要外设资源六.单片机开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.GD32单片机内部框图3.GD32单片机管脚图4.GD32单片机每个管脚功能5.单片机功耗数…...

8个我平时每天都会看的网站,涵盖办公、娱乐、学习等

分享8个我平时每天都会看的网站&#xff0c;涵盖办公、娱乐、学习等多种类别&#xff0c;试过就知道有多好用&#xff01; 1、MyFreeMP3 tools.liumingye.cn/music/#/ 一个可以免费听歌的平台&#xff0c;不用充会员&#xff0c;里面收录了大多数的国内外知名流行歌手、乐队的…...

Vue2——父子之间间的调用

1、父组件给子组件传值使用props 父组件&#xff1a; <div><SonPage msg"通过props传递值---父>子" ></SonPage><h1>父组件</h1></div> 子组件 <div :style"{border: 1px solid red}"><h1>子组件…...

xfs Vs ext4?

xfs测试 ext4 测试 对比 XFS和EXT4都是Linux系统中广泛使用的文件系统&#xff0c;它们各有特点和优势&#xff0c;选择哪一个取决于你的具体需求和使用场景。下面是它们的主要特点&#xff1a; XFS: 由Silicon Graphics Inc.开发&#xff0c;最初用于SGI的IRIX系统。支持非…...

数据结构stack (笔记)

文章目录 1. 概念理解易混淆内容 2. 时间复杂度3. 实现方式4. 应用5. 内容出处 1. 概念理解 stack(中文名&#xff1a;堆栈、栈)&#xff1a;虽然它叫堆栈&#xff0c;但是它其实指的是栈&#xff0c;跟堆没啥关系。 栈的特性&#xff1a;先进后出、后进先出(这个过程就…...

SQL - 创建 表和数据库

创建和删除数据库 create database if not exists sql_store2; //创建 drop database if exists sql_store2; //删除 -- 创建数据库 create database if not exists sql_store2; drop database if exists sql_store2; 创建表 create table customers (someting); -- 创建表 cre…...

使用 Arch Linux 几个月有感 | 为什么我选择 Arch Linux ,Arch 的优缺点有什么 | 一些Linux发行版推荐

&#xff08;终端是 Yakuake &#xff0c;KDE 自带&#xff09; 一点碎碎念&#xff0c;可以跳过不看 几年前从 CentOS 接触的 Linux &#xff0c;试图搭建一个KMS服务器 但是失败了 &#xff0c;后来装过 Ubuntu Debian deepin Kali Kubuntu Manjaro&#xff0c;踩一路坑最后…...

SQLserver中的增删改查和数据类型

SQLserver增删查改语句 SQL Server 是一种关系数据库管理系统&#xff0c;用于存储、管理和检索数据。以下是一些基本的 SQL 语句&#xff0c;用于在 SQL Server 中执行增删查改操作&#xff1a; 插入数据&#xff08;Insert&#xff09; 插入完整行&#xff1a; INSERT INTO …...

个人收藏个性化、实用性、可玩性在线网站持续更新,与君共享

1.https://handraw.top/ 支持中文手绘效果的白板工具&#xff0c;比较怀旧复古风格 界面简单风 2.https://app.diagrams.net 流程图、UML图、网络图、组织结构图、思维导图等&#xff0c;比较专业 可导出图片 PDF HTLM等各种格式 3.https://www.processon.com 主要用于生成…...

win10蓝牙只能发送,无法接收

给win10升了级&#xff0c;到22H2&#xff0c;蓝牙出了问题 以前接收&#xff0c;就是默认直接就可以接收。现在只能发送&#xff0c;无法接收。 在网上找了很多办法都没奏效&#xff0c;目前的方法是&#xff0c; 每次接收&#xff0c;都要操作一次&#xff0c;而不是自动接…...

【论文阅读03】用于海洋物体检测的多注意力路径聚合网络

来源&#xff1a;用于海洋物体检测的多注意力路径聚合网络 |应用智能 (springer.com) 一、背景&#xff1a; 水下图像存在偏色、对比度低、能见度低等问题&#xff0c;使得海洋物体难以被探测到。这些都增加了海上目标探测的难度。 目前流行的检测器方法是基于卷积神经网络&…...

Linux 进程(2)

进程的回收 1.wait 原型 pid_t wait(int *status); 功能&#xff1a;该函数可以阻塞等待任意子进程退出 并回收该进程的状态。 一般用于父进程回收子进程状态。 参数&#xff1a;status 进程退出时候的状态 如果不关心其退出状态一般用NULL表示 如果要回收进程…...

[CSCCTF 2019 Qual]FlaskLight1

打开题目 右键查看一下源代码 看到提示&#xff0c;需要用GET方search函数...

layui table表单 checkbox选中一个其它也要选中

当我们选中其中一个商品的时候同类型的商品状态也要跟着改变 所以要在表单加载完成后去监听checkbox ,done:function (res) {console.log(详情表格数据,res)tableDetailList res.data;// 监听表格复选框选择table.on(checkbox( INST_SELECTORS.instLayFilters.unpaidTableDe…...

【pip镜像设置】pip使用清华镜像源安装

文章目录 问题&#xff1a;问题描述原因分析&#xff1a;PyPI&#xff08;Python Package Index&#xff09; PypI 镜像列表解决方案&#xff1a; 问题&#xff1a; 大家经常会使用 pip 进行python 的第三方库安装&#xff0c;但是&#xff0c;有时会出现 ERROR: Could not f…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...