C语言指针和函数
文章目录
- C语言指针和函数
- 一、指针与函数
- 1.传递指针给函数
- 2.指针函数
- 3.函数指针
- 4.回调函数
- 二、多级指针
- 三、空指针
- 四、野指针
C语言指针和函数
在C语言的编程领域中,指针是一把强大而又危险的“双刃剑”。它不仅能够直接操作内存,提升程序的运行效率,还能实现一些复杂的数据结构和算法。今天,让我们一同深入探索指针与函数、多级指针、空指针以及野指针的奥秘。
一、指针与函数
指针与函数在C语言中紧密相连,它们的组合使用为编程带来了极大的灵活性和效率。下面从传递指针给函数、指针函数、函数指针以及回调函数这四个方面进行详细介绍。
1.传递指针给函数
在C语言中,将指针作为参数传递给函数是一种常见的编程技巧。通过传递指针,函数可以直接操作调用者提供的变量,而不是操作变量的副本,这在需要修改调用者变量值或处理大型数据结构时尤为重要。
以交换两个整数的值为例,如果不使用指针,函数只能操作变量的副本,无法真正改变调用者的变量值:
// 错误示范:无法交换两个整数的值
void swap_wrong(int a, int b) {int temp = a;a = b;b = temp;
}
而使用指针传递,则可以实现真正的交换:
// 正确示范:使用指针交换两个整数的值
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}int main() {int num1 = 5, num2 = 10;printf("交换前: num1 = %d, num2 = %d\n", num1, num2);swap(&num1, &num2);printf("交换后: num1 = %d, num2 = %d\n", num1, num2);return 0;
}
在上述代码中,swap
函数接受两个指向整数的指针作为参数。通过指针,函数可以直接访问并修改调用者的变量值,从而实现了两个整数的交换。
除了简单变量,指针还常用于传递数组给函数。由于数组名在很多情况下会被隐式转换为指向数组首元素的指针,因此可以将数组名作为指针传递给函数,以实现对数组元素的操作:
// 计算数组元素之和
int sum_array(int *arr, int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += arr[i];}return sum;
}int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);int total = sum_array(arr, size);printf("数组元素之和: %d\n", total);return 0;
}
在这个例子中,sum_array
函数接受一个指向整数的指针 arr
和数组的大小 size
作为参数。通过指针,函数可以遍历并计算数组元素的和。
2.指针函数
指针函数是指返回值为指针的函数。这种函数在需要返回一个指向某个数据的指针时非常有用,例如返回动态分配的内存地址或指向全局变量的指针。
下面是一个返回指向字符数组的指针的函数示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 指针函数:返回指向字符数组的指针
char *create_string(const char *str) {char *new_str = (char *)malloc((strlen(str) + 1) * sizeof(char));if (new_str == NULL) {printf("内存分配失败\n");return NULL;}strcpy(new_str, str);return new_str;
}int main() {const char *original = "Hello, World!";char *copied = create_string(original);if (copied!= NULL) {printf("复制的字符串: %s\n", copied);free(copied);}return 0;
}
在上述代码中,create_string
函数接受一个指向字符数组的指针 str
作为参数,并返回一个指向新的字符数组的指针。函数内部使用 malloc
动态分配内存,然后将传入的字符串复制到新的内存中,最后返回该内存的指针。在 main
函数中,调用 create_string
函数并使用返回的指针输出复制的字符串,最后记得释放动态分配的内存,以避免内存泄漏。
指针函数还常用于返回指向结构体的指针,例如在链表操作中,经常需要返回指向新创建节点的指针:
// 定义链表节点结构体
typedef struct Node {int data;struct Node *next;
} Node;// 创建新节点的指针函数
Node *create_node(int value) {Node *new_node = (Node *)malloc(sizeof(Node));if (new_node == NULL) {printf("内存分配失败\n");return NULL;}new_node->data = value;new_node->next = NULL;return new_node;
}
在这个链表节点创建的示例中,create_node
函数返回一个指向新创建的 Node
结构体的指针,方便在链表操作中添加新节点。
3.函数指针
函数指针是指向函数的指针变量,它存储了函数在内存中的起始地址。通过函数指针,可以像调用普通函数一样调用其所指向的函数,这在实现动态函数调用和回调函数时非常有用。
定义函数指针的一般形式为:返回值类型 (*指针变量名)(参数列表)
。例如,定义一个指向返回值为 int
,参数为两个 int
类型的函数的指针:
int add(int a, int b) {return a + b;
}int main() {int (*funcPtr)(int, int);funcPtr = add;int result = funcPtr(3, 5);printf("结果: %d\n", result);return 0;
}
在这段代码中,int (*funcPtr)(int, int)
定义了一个函数指针 funcPtr
,它可以指向返回值为 int
,参数为两个 int
类型的函数。然后,将函数 add
的地址赋给 funcPtr
,这样就可以通过 funcPtr
来调用 add
函数了。
函数指针在实际应用中非常广泛,比如在实现回调函数时,就可以使用函数指针来指定回调的具体函数。例如,在排序算法中,可以传递一个比较函数的指针,让排序算法根据不同的比较规则进行排序:
#include <stdio.h>// 比较函数:升序比较
int compare_ascending(int a, int b) {return a - b;
}// 比较函数:降序比较
int compare_descending(int a, int b) {return b - a;
}// 冒泡排序函数,接受数组、数组大小和比较函数指针
void bubble_sort(int *arr, int size, int (*compare)(int, int)) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - 1 - i; j++) {if (compare(arr[j], arr[j + 1]) > 0) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() {int arr[] = {5, 3, 8, 1, 4};int size = sizeof(arr) / sizeof(arr[0]);// 升序排序bubble_sort(arr, size, compare_ascending);printf("升序排序结果: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");// 降序排序bubble_sort(arr, size, compare_descending);printf("降序排序结果: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
在这个冒泡排序的示例中,bubble_sort
函数接受一个比较函数的指针 compare
作为参数。通过传递不同的比较函数指针(compare_ascending
或 compare_descending
),可以实现升序或降序排序。
4.回调函数
回调函数是一种通过函数指针实现的机制,它允许将一个函数作为参数传递给另一个函数,并在适当的时候被调用。回调函数在许多C语言库函数和系统编程中都有广泛应用,例如在事件驱动编程、异步操作和排序算法中。
下面以一个简单的数学计算函数为例,展示回调函数的使用:
// 通用的数学计算函数,接受两个数和一个计算函数指针
double calculate(double a, double b, double (*operation)(double, double)) {return operation(a, b);
}// 加法函数
double add(double a, double b) {return a + b;
}// 乘法函数
double multiply(double a, double b) {return a * b;
}int main() {double num1 = 3.5, num2 = 2.5;// 使用加法回调double result1 = calculate(num1, num2, add);printf("加法结果: %.2f\n", result1);// 使用乘法回调double result2 = calculate(num1, num2, multiply);printf("乘法结果: %.2f\n", result2);return 0;
}
在上述代码中,calculate
函数接受两个双精度浮点数 a
和 b
,以及一个指向函数的指针 operation
。operation
指向的函数接受两个双精度浮点数并返回一个双精度浮点数。通过传递不同的函数指针(add
或 multiply
),calculate
函数可以执行不同的数学运算。
在操作系统的事件处理机制中,回调函数也经常被使用。例如,在图形用户界面(GUI)编程中,当用户点击按钮时,系统会调用预先注册的回调函数来处理点击事件:
// 模拟按钮点击事件处理函数
void button_click_callback() {printf("按钮被点击了!\n");
}// 模拟注册按钮点击事件的函数
void register_button_click(void (*callback)()) {// 这里模拟系统注册回调函数的过程// 当按钮被点击时,会调用这个回调函数callback();
}int main() {register_button_click(button_click_callback);return 0;
}
在这个简单的GUI事件处理示例中,register_button_click
函数接受一个指向 button_click_callback
函数的指针。当模拟的按钮点击事件发生时,register_button_click
函数会调用 button_click_callback
函数,从而实现事件的处理。
二、多级指针
多级指针是指指向指针的指针,通过它可以间接访问到目标数据。在C语言中,最常见的是二级指针。
定义二级指针的形式为:数据类型 **指针变量名
。例如,定义一个二级指针:
int main() {int num = 10;int *ptr = #int **ptr2 = &ptr;printf("num的值: %d\n", num);printf("通过一级指针访问num的值: %d\n", *ptr);printf("通过二级指针访问num的值: %d\n", **ptr2);return 0;
}
在这段代码中,ptr
是指向 num
的一级指针,ptr2
是指向 ptr
的二级指针。通过 *ptr
可以访问 num
的值,而通过 **ptr2
同样可以访问到 num
的值,只不过是通过两级间接访问。
多级指针在处理复杂数据结构,如二维数组、链表的链表等场景中非常有用。以二维数组为例,可以使用二级指针来操作二维数组,实现更灵活的内存管理和数据访问。
三、空指针
空指针是一个特殊的指针,它不指向任何有效的内存地址。在C语言中,通过将指针赋值为 NULL
来表示空指针。NULL
是一个宏定义,通常在 stdio.h
等头文件中定义为 ((void *)0)
。
例如:
int main() {int *ptr = NULL;// 检查指针是否为空if (ptr == NULL) {printf("指针为空\n");}return 0;
}
在实际编程中,在使用指针之前,一定要检查它是否为空指针,以避免程序崩溃或出现未定义行为。比如在访问指针指向的内存之前,添加如下判断:
int *ptr = NULL;
// 假设这里可能从某个函数获取ptr的值
if (ptr!= NULL) {// 可以安全地访问ptr指向的内存int value = *ptr;
}
四、野指针
野指针是指指向非法内存地址的指针,它的出现往往会导致程序出现难以调试的错误。野指针产生的原因主要有以下几种:
- 指针未初始化:定义指针变量后,如果没有对其进行初始化,它的值是不确定的,可能指向任意内存地址,成为野指针。
int *ptr;
// 这里ptr是野指针,因为未初始化
- 指针释放后未置为
NULL
:使用free
函数释放动态分配的内存后,如果没有将指针置为NULL
,该指针仍然指向已经释放的内存,此时它就变成了野指针。
int *ptr = (int *)malloc(sizeof(int));
free(ptr);
// 此时ptr是野指针
- 指针越界访问:当指针超出了其所指向的内存范围进行访问时,也会导致野指针的产生。
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
// 访问越界
ptr += 10;
// 此时ptr指向非法内存地址,成为野指针
为了避免野指针的出现,在定义指针时一定要进行初始化,释放内存后及时将指针置为 NULL
,并且在访问指针时要确保没有越界。
C语言中的指针与函数、多级指针、空指针和野指针各自具有独特的特性和用途。正确理解和使用它们,能够让我们编写出高效、灵活的程序;而对它们的误用,则可能导致程序出现各种难以排查的错误。希望通过这篇博客,大家能对这些指针相关的概念有更深入的理解,在C语言编程的道路上更加得心应手。
相关文章:
C语言指针和函数
文章目录 C语言指针和函数一、指针与函数1.传递指针给函数2.指针函数3.函数指针4.回调函数 二、多级指针三、空指针四、野指针 C语言指针和函数 在C语言的编程领域中,指针是一把强大而又危险的“双刃剑”。它不仅能够直接操作内存,提升程序的运行效率&a…...
左右开弓策略思路
一、策略概述 本策略是一种基于多种技术指标的复杂交易策略,包括自定义指标计算、过滤平滑处理以及交易信号生成。 该策略通过不同的交易平台代码段实现,旨在通过分析历史价格数据来预测未来价格走势,并据此生成交易信号。 二、主要技术指标…...
mapbox基础,加载F4Map二维地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…...
doxygen自动生成文档,注释容易错位的补充
开发过程中,为了简化api开发文档的编写工作,我们可以使用doxygen的标注来进行文档注释,最后自动化的生成相关文档: 参考:https://developer.aliyun.com/article/935529 参考:https://blog.csdn.net/qq_3459…...
git操作0409
git init git add. git commit -m "Initial commit" git checkout 7890abc # 切换到旧版本代码(只读) git checkout master # 切回最新版本 git checkout -b new_branch 789abcd # 或 git checkout -b new_branch HEAD~3 很重点 git reflog …...
电阻的额定功率与额定电压详解
一、基本定义 额定功率(Rated Power) 定义:电阻在长期安全工作时允许消耗的最大功率,超过此值可能导致过热甚至烧毁。 公式: P I R 或 P V / R (I:电流,V:电压&#…...
【后端开发】SpringBoot与Spring MVC
文章目录 创建项目目录介绍Spring MVCservletMVCSpring MVCSpringboot与Spring MVC的区别Spring MVC交互 创建项目 新建一个Springboot项目 对应描述 目录介绍 src/main/java:Java 源代码 src/main/resources:为静态资源或配置⽂件: ----…...
如何禁用 PyCharm 的测试功能
如何禁用 PyCharm 的测试功能? PyCharm 的测试功能默认会自动检测项目中符合命名规则的测试文件(如以 test_ 开头的文件)并关联测试框架。若需禁用该功能,可通过以下方法操作: 方法一:全局禁用默认测试框架…...
【Spiffo】光速项目:LVGL v9框架下的MIPI简易相机_Part2
简介 本期接上回的工程部署讲一下整个工程的框架逻辑以及相关的模块作用机制,包括mipi抓图像以及后续传递到显示屏的链路逻辑等。 一、核心逻辑 1、如何抓到图像数据并显示 首先能够从摄像头捕获画面并显示是一个相机最起码要能实现的功能。所以先要搞清楚整个链…...
pycharm编译部署智能合约(solcx与web3搭配)
solcx 是一个 python 库,提供了 solidity 编译器的 python 绑定。它使开发者能够直接从 python 中编译 solidity 源代码,生成以太坊智能合约的字节码(Bytecode)和 ABI(Application Binary Interface)。这个库通常用于与 Web3 库配合使用,帮助开发者进行智能合约的部署、…...
微信小程序中的openid的作用
微信小程序中的openid的作用 引言 在当今数字化时代,用户体验成为了产品成功与否的关键因素之一。微信小程序作为连接用户与服务的重要桥梁,在提升用户体验方面发挥着重要作用。其中, openid(开放身份标识符)是微信小…...
AAAI 2025新研究!大语言模型+MARL=论文新思路?
最新研究显示,多智能体强化学习(MARL)正迎来一系列技术革新,让AI系统真正具备“群体智能”。同济大学团队提出的动态图通信网络(TGCNet),通过Transformer建模智能体间的动态协作关系,…...
旅行世界宠物养殖合成游戏源码
旅行世界宠物养殖合成游戏源码,游戏养成类系统,用户能够通过养狗和参加其他活动获取算力,每日任务不断更新,完结即可收取算力,算力能够兑换现金红包。 邀请好友得两级活跃收益提成,徒弟B100.%,徒…...
列表之链表_C
数据结构(邓俊辉):列表及相关概念_listnodeposi-CSDN博客 #include <stdio.h> #include <stdlib.h>// 定义Rank类型为int typedef int Rank;// 定义ListNode结构体 typedef struct ListNode {int data;struct ListNode* pred;st…...
图解Java设计模式
1、设计模式面试题 2、设计模式的重要性 3、7大设计原则介绍...
CCF GESP Python编程 四级认证真题 2025年3月
Python 四级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D C B C D C A A D B D A C B C 1 单选题(每题 2 分,共 30 分) 第 1 题 2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是…...
2025最新系统 Git 教程(四)
2.6 Git 基础 - 打标签 打标签 像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。 在本节中…...
数学知识——欧拉函数
欧拉函数 1 ∼ N 1∼N 1∼N 中与 N N N互质的数的个数被称为欧拉函数,记为 ϕ ( N ) \phi(N) ϕ(N)。 欧拉函数 对于 N p 1 α 1 p 2 α 2 p 3 α 3 . . . p k α k Np_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}...p_k^{\alpha_k} Np1α1p2α2p3α3…...
Dify 识别 “subject“ and “intention“ 的提示词
Dify 识别 "subject" and "intention" 的提示词 内容如下: You need to decompose the users input into "subject" and "intention" in order to accurately figure out what the users input language actually is. Not…...
Hi168云平台部署Ansible学习环境
前言 之前发布的文章已经介绍过了在Hi168云平台部署openEuler学习环境,那么既然能部署openEuler了,其他的各类学习环境自然也就可以部署了。 Ansible简介 Ansible 是一个运维自动化工具,可以通过 SSH 协议对远程主机进行管理,对…...
Anacond虚拟环境里安装GPU版本Pytorch
CUDA/cudnn/CUDAToolkit简单区分 pytorch与cuda关系简单介绍 pytorch是一个深度学习的框架,能够调用cuda进行gpu加速。一般来说你的电脑里是有相关cuda的驱动的(可用nvidia-smi命令验证,能运行就说明有,不能运行去搜索安装&#…...
FRP的proxies只是建立通道,相当于建立与服务器沟通的不同通道而不是直接将路由器与服务器云端沟通
没有更好的办法了吗,我看frpc.toml的里面可以设置两个proxies那我esp32的监听端口设置在frpc.toml里面它不也能跟云服务器建立联系吗,比如远程与本地端口都配置为5112那云服务器接收到的5112访问会以frp配置的本地端口5112转发到frp客户端的路由器&#…...
Android开发鸿蒙环境问题记录
Android开发鸿蒙环境问题记录 (用于记录开发中鸿蒙环境差异及问题,持续更新) 2025.4.9 问题 使用android.intent.action.TIME_TICK广播时,动态注册在鸿蒙4.0系统正常,但在鸿蒙3.0系统无法接收广播。 解决方案 在An…...
在 WSL2的 Ubuntu 20.04 中安装 Docker
WSL1升级到WSL2参考:WSL1升级到WSL2注意事项-CSDN博客 1. 更新系统包 首先,确保系统包是最新的: sudo apt update sudo apt upgrade -y sudo apt upgrade -y 是 Ubuntu/Debian Linux 系统中的一条命令,用于升级所有已安装的软…...
LeetCode 252 会议室题全解析:Swift 实现 + 场景还原
文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在这篇文章中,我们将深入探讨LeetCode第252题“会议室”的问题,提供一个用Swift编写的解决方案,并结合实际场景进行分析。通过这篇文章,你将…...
Postman的内网使用教程
在软件开发和测试过程中,接口测试是确保系统间通信正常的重要环节。当处于内网环境,无法直接访问外网资源时,如何高效地使用Postman进行接口测试也逐渐成为许多开发者关心的问题。 前期准备 安装Postman 从官方网站下载并安装最新版本的Pos…...
【软件测试】Postman中如何搭建Mock服务
在 Postman 中,Mock 服务是一项非常有用的功能,允许你在没有实际后端服务器的情况下模拟 API 响应。通过创建 Mock 服务,你可以在开发阶段或测试中模拟 API 的行为,帮助团队成员进行前端开发、API 测试和集成测试等工作。 Mock 服…...
【NLP 57、LLM通用能力评价方式】
人生如题,放下,是最优雅的解法 —— 25.4.9 目前,我们通过一些特殊的“集合”来评价大语言模型效果 一、MMLU 集合 测量大规模多任务语言理解 评估模型在57个学科领域的综合知识理解能力,覆盖人文、社科、STEM&…...
centos7.9升级OpenSSL 1.1.1
centos7.9升级openssl 人工智能已经很准了: 问题: [rootcentos01 ~]# openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 [rootcentos01 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要升级OpenSSL,请给出具体…...
10A 大电流 DCDC 降流芯片 WD5030
10A 大电流 DCDC 降压芯片 WD5030 在电子设备的电源管理领域,高效稳定的 DCDC 芯片至关重要。今天我们来深入探讨一款性能卓越的 10A 大电流 DCDC 降流芯片 ——WD5030。它在众多电子应用场景中展现出了强大的优势,为各类设备的稳定供电提供了可靠保障。…...
# 基于BERT的文本分类
基于BERT的文本分类项目的实现 一、项目背景 该文本分类项目主要是情感分析,二分类问题,以下是大致流程及部分代码示例: 二、数据集介绍 2.1 数据集基本信息 数据集自定义类型二分类(正面/负面)样本量训练集 验证…...
Verilog学习-1.模块的结构
module aoi(a,b,c,d,f);/*模块名为aoi,端口列表a、b、c、d、f*/ input a,b,c,d;/*模块的输入端口为a,b,c,d*/ output f;;/*模块的输出端口为f*/ wire a,b,c,d,f;/*定义信号的数据类型*/ assign f~((a&b)|(~(c&d)));/*逻辑功能描述*/ endmoduleveirlog hdl 程…...
界面控件DevExpress WPF v25.1新功能预览 - 数据网格、报表性能增强
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...
【创新实训个人博客】prompt嵌入
通过对camel技术的理解,修改了项目内容 能够初步实现广告内容相关的文本 修改了typing.py中的定义 class RoleType(Enum): ASSISTANT "assistant" USER "user" CRITIC "critic" EMBODIMENT "embodiment" DEFAULT &q…...
Linux 进程的替换
进程程序替换 要讲好这个我为大家准备了五个步骤 1. 先用代码给大家展示一下现象 2.解释原理 3.将代码改成多进程版 4.使用所有的方法,并认识函数参数的含义。 5.其他 我们现在开始第一个 1. 先用代码给大家展示一下现象 关于进程的替换一共有七个函数&…...
netty启用websocket的压缩机制
netty启用websocket的压缩机制 package com.aerotop.connector.websocket.base;import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.compression.JZlibDec…...
【python】针对Selenium中弹框信息无法定位的问题,以下是综合解决方案及注意事项:
一、常见原因分析 1.1 弹窗类型不匹配 若弹窗为alert,需使用driver.switch_to.alert处理; 若为confirm或prompt,同样适用该方法。 1.2 窗口句柄切换问题 新窗口或弹窗可能开启新句柄,需先通过driver.window_handles切换到对应句…...
进程与信号
前言 接触计算机的时候我们就接触过信号。比如说当我们进程卡死的时候,windows系统会跳出来一个弹窗告诉我们是否等待进程响应,如果关闭进程那么系统就会发信号给进程然后终止掉它。再比如我们打开任务管理器的时候,想要关闭进程那也是在发送…...
SQL解析器:实现进阶功能
SQL解析器:实现进阶功能 在上一篇文章中,我们介绍了SQL解析器的基础架构和核心功能实现,包括基本的SELECT、INSERT、UPDATE语句解析。本文将深入探讨SQL解析器的进阶功能实现,重点关注我们新增的DROP、JOIN、DELETE语句解析以及嵌…...
字体从版权合规到技术适配,你好字库全场景解决方案解析
一、开发者字体使用的三大核心困境 在软件开发与设计过程中,字体选择往往成为「甜蜜的负担」: 版权风险高:商业项目误用未授权字体,可能面临数万元赔偿(某创业公司曾因使用「方正粗黑」被索赔 8 万元) …...
深入理解 Java ArrayList 扩缩容机制(含源码分析)
标签: Java, ArrayList, 集合框架, 源码分析, 扩容机制, 性能优化, CSDN 摘要: java.util.ArrayList 作为 Java 集合框架中最常用的类之一,其动态数组的特性深受开发者喜爱。然而,“动态”背后的扩容与缩容机制是怎样的ÿ…...
LeetCode详解之如何一步步优化到最佳解法:26. 删除有序数组中的重复项
LeetCode详解系列的总目录(持续更新中): LeetCode详解之如何一步步优化到最佳解法:前100题目录(更新中...)-CSDN博客 LeetCode详解系列的上一题链接: LeetCode详解之如何一步步优化到最佳解法…...
doris基础使用
目录 1、一般使用 2、数据源通过catalog连接 1、es 2、clickhouse 3、db2 3、问题 (1)doris连接es一直报错 1、一般使用 (1)查询doris的catalog show catalogs; (2)查询catlog的连接信息 以catalog…...
Python 3.x cxfreeze打包exe教程
Python 3.x cxfreeze打包exe教程 https://blog.csdn.net/qq_33704787/article/details/123926953 去官网 下载安装 pip install cx-Freeze7.2.9 https://pypi.org/project/cx-Freeze/7.2.9/ 安装到 你的 python 的 script文件夹下面 (全局或是 虚拟环境都行&#x…...
SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用
SQL 是一种至关重要的数据库操作语言,尽管其语法与通用编程语言有所不同,但因其在众多应用中的广泛使用,大多数程序员都具备一定的 SQL 编写能力。然而,当面对复杂的 SQL 语句或优化需求时,往往需要专业数据库开发工程…...
nginx或tengine服务器,配置HTTPS下使用WebSocket的线上环境实践!
问题描述: HTTPS 下发起WS连接,连接失败,Chrom 浏览器报错。 socket.js:19 Mixed Content: The page at https://app.XXX.com was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ws://172.16.10.80:903…...
原创工具scoopex - scoop增强工具,提供github proxy和url净化功能
说明 scoop是一款十分优秀的windows下软件管理工具,但是在国内使用,总会遇到网络问题,不得不翻墙或者梯子才能解决。 网上有很多提供了cn版本的bucket,虽然解决了一些问题,但是也带来了默认proxy不可用问题࿰…...
TPS入门DAY03 服务器篇
1.创建按钮和对应的回调函数 /* 大厅按钮 */UPROPERTY(meta (BindWidget))UButton* HostButton;/* 加入会话按钮 */UPROPERTY(meta (BindWidget))UButton* JoinButton;private:UFUNCTION()void OnHostButtonClicked();UFUNCTION()void OnJoinButtonClicked(); 创建调试助手 …...
STM32单片机入门学习——第30节: [9-6] FlyMcu串口下载STLINK Utility
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.09 STM32开发板学习——第30节: [9-6] FlyMcu串口下载&STLINK Utility 前言开发…...
基于springboot钻孔数据管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本钻孔数据管理系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java语言、Hadoop、数据可视化技术进行编写,使用了Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。用户主要功能包括&…...