1 指针的本质:地址与解引用
1.1 什么是指针?
指针是一个变量,其存储的值是另一个变量的内存地址。你可以将内存想象成一个巨大的公寓楼,每个字节是一个房间,每个房间都有唯一的门牌号(地址)。指针就是记录着这些门牌号的便签。
声明指针:
数据类型 *指针变量名;
int *p; // 指向整型的指针 char *ch; // 指向字符型的指针 float *fp; // 指向浮点型的指针
*
表示这是一个指针变量,数据类型
说明了指针所指向的内存区域中存储的数据类型。初始化指针:使用
&
(取地址操作符)获取变量的地址。int a = 10; int *p = &a; // p 指向变量a的地址
未初始化的指针是“野指针”,指向随机内存,非常危险。良好的习惯是定义时立即初始化,若暂无明确指向,可初始化为
NULL
(或0
)。int *safe_ptr = NULL; // 安全的初始化
解引用指针:使用
*
(解引用操作符)访问或修改指针所指向地址的值。printf("a = %d\n", a); // 输出: a = 10 printf("*p = %d\n", *p); // 输出: *p = 10 (通过p访问a的值) *p = 20; // 通过指针p修改其指向地址(即变量a)的值 printf("a is now %d\n", a); // 输出: a is now 20
解引用本质上是一次内存访问。对
*p
的操作就是对p
所存地址处数据的操作。
1.2 指针的大小
指针变量的大小是固定的,取决于系统的寻址能力,与它指向的数据类型无关:
- 32位系统:通常为 4字节
- 64位系统:通常为 8字节
你可以用sizeof
操作符验证:
printf("Size of int pointer: %zu\n", sizeof(int*));
// 输出: 8 (在64位系统)
printf("Size of char pointer: %zu\n", sizeof(char*));
// 输出: 8
printf("Size of double pointer: %zu\n", sizeof(double*));
// 输出: 8
2 指针的算术运算
指针的算术运算(加减)不是简单的整数加减,而是以所指向数据类型的大小为单位进行移动。
int arr[] = {
10, 20, 30, 40, 50
};
int *p = arr;
// p 指向数组首元素(arr[0])的地址
printf("*p = %d\n", *p);
// 输出: 10
printf("Address: %p\n", p);
p++;
// 向后移动一个int单位(通常是4字节),指向arr[1]
printf("After p++:\n");
printf("*p = %d\n", *p);
// 输出: 20
printf("Address: %p\n", p);
// 地址值比之前增加了4
p += 2;
// 向后移动两个int单位,指向arr[3]
printf("After p += 2:\n");
printf("*p = %d\n", *p);
// 输出: 40
减法运算可以计算两个指针之间的距离(元素个数):
int *p1 = &arr[0];
int *p2 = &arr[3];
ptrdiff_t diff = p2 - p1;
// 计算两个指针之间相差的元素个数
printf("p2 - p1 = %td\n", diff);
// 输出: 3 (相差3个元素)
注意:指针减法的两个指针必须指向同一块连续内存空间(如同一个数组),否则行为未定义。
3 指针与数组
在C语言中,数组名在大多数情况下是一个指向数组首元素的常量指针。
int arr[5] = {
1, 2, 3, 4, 5
};
// 以下访问方式是等价的:
printf("arr[0] = %d\n", arr[0]);
printf("*arr = %d\n", *arr);
// 对数组名解引用访问第一个元素
// 通过指针算术访问数组元素
printf("arr[1] = %d\n", *(arr + 1));
printf("arr[2] = %d\n", *(arr + 2));
// 定义一个指针遍历数组
int *ptr = arr;
for (int i = 0; i <
5; i++) {
printf("Element %d: %d\n", i, *(ptr + i));
// 或 printf("Element %d: %d\n", i, ptr[i]); // 指针也可以使用下标!
}
重要区别:数组名是指针常量,其值(指向的地址)不可改变。而指针变量可以重新赋值。
int arr[5] = {
1, 2, 3, 4, 5
};
int *p = arr;
// p = p + 1; // 合法,p现在指向arr[1]
// arr = arr + 1; // 非法!编译错误!数组名是常量,不能修改。
4 指针与函数
4.1 指针作为函数参数(模拟“传引用”)
C语言函数参数传递默认是传值调用,即函数获得的是实参值的副本。修改副本不会影响原始实参。若希望函数内部修改外部变量的值,需要传递变量的指针。
// 一个交换两个变量值的函数
void swap(int *x, int *y) {
// 接收指针作为参数
int temp = *x;
// 解引用x,获取其指向的值
*x = *y;
// 将y指向的值赋给x指向的内存
*y = temp;
// 将temp的值赋给y指向的内存
}
int main() {
int a = 10, b = 20;
printf("Before swap: a = %d, b = %d\n", a, b);
swap(&a, &b);
// 传递变量a和b的地址
printf("After swap: a = %d, b = %d\n", a, b);
return 0;
}
输出:
Before swap: a = 10, b = 20
After swap: a = 20, b = 10
工作原理:函数 swap
接收的是 a
和 b
的地址(指针),通过解引用操作 *x
和 *y
,直接操作 main
函数栈帧中 a
和 b
所在的内存单元,从而真正交换它们的值。
4.2 数组作为函数参数
当数组作为函数参数传递时,它会退化为指向其首元素的指针。因此,函数内部无法通过 sizeof
获取原始数组的长度。
void printArray(int arr[], int size) {
// int arr[] 等价于 int *arr
// 在函数内部,sizeof(arr) 将是指针的大小(8或4),而不是整个数组的大小!
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
// 虽然arr是指针,但仍可使用下标语法
}
printf("\n");
}
int main() {
int myArray[] = {
1, 2, 3, 4, 5
};
int length = sizeof(myArray) / sizeof(myArray[0]);
// 正确计算数组长度
printArray(myArray, length);
// 传递数组名和实际长度
return 0;
}
5 动态内存分配:堆(Heap)
5.1 堆与栈的区别
理解堆和栈的区别至关重要。
特性 | 栈 (Stack) | 堆 (Heap) |
---|---|---|
管理方式 | 编译器自动分配和释放 | 程序员手动分配 (malloc , calloc ) 和释放 (free ) |
生命周期 | 函数执行期间,函数返回后自动销毁 | 从分配开始直到显式释放为止 |
大小限制 | 较小(例如几MB),操作系统依赖 | 很大,仅受系统可用虚拟内存大小限制 |
分配速度 | 非常快 | 相对较慢,涉及更复杂的管理 |
碎片化 | 无 | 可能产生碎片 |
灵活性 | 大小和生命周期在编译时确定 | 大小和生命周期在运行时动态决定 |
5.2 动态内存分配函数
C语言使用 malloc
, calloc
, realloc
在堆上分配内存,使用 free
释放内存。
malloc
:分配指定字节数的未初始化内存。// 分配可存储10个int的内存空间 int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // 分配失败必须检查!NULL可能意味着内存不足 fprintf(stderr, "Memory allocation failed!\n"); exit(1); } // 使用分配的内存...
calloc
:分配指定数量和大小的内存,并初始化为0。// 分配10个int,并全部初始化为0 int *arr_zero = (int *)calloc(10, sizeof(int));
realloc
:调整已分配内存块的大小(可能移动位置)。// 将之前分配的内存扩大到20个int int *new_arr = (int *)realloc(arr, 20 * sizeof(int)); if (new_arr == NULL) { // 处理失败,注意:原来的arr指针依然有效,需要单独释放 free(arr); fprintf(stderr, "Memory reallocation failed!\n"); exit(1); } else { arr = new_arr; // 让arr指向新的内存块 }
free
:释放之前动态分配的内存。free(arr); // 释放arr指向的内存 arr = NULL; // 良好实践:释放后立即将指针置为NULL,防止悬垂指针
谁分配,谁释放:确保每个
malloc
,calloc
,realloc
都有对应的free
。
5.3 常见动态内存错误(漏洞根源)
内存泄漏 (Memory Leak):分配的内存没有被释放,导致程序持续占用内存直至耗尽。
void leak() { int *ptr = (int *)malloc(100 * sizeof(int)); // ... 使用ptr ... // 忘记 free(ptr); 函数返回后,再也无法访问或释放那100个int的内存! }
Use-After-Free:释放内存后,再次使用该指针访问已释放的内存。这是一个严重的安全漏洞,攻击者可能利用此漏洞执行恶意代码。
int *ptr = (int *)malloc(sizeof(int)); *ptr = 42; free(ptr); // 内存被释放,交还给系统 // ptr现在是一个“悬垂指针”(Dangling Pointer) *ptr = 10; // 危险!未定义行为:可能崩溃,也可能 silently corrupt data。
Double Free:对同一块动态内存多次调用
free
。这会导致内存管理数据结构损坏,可能引发程序崩溃。int *ptr = (int *)malloc(sizeof(int)); free(ptr); // ... free(ptr); // 错误!同一内存释放两次。
相关文章:
详细介绍:【C语言】第四课 指针与内存管理
详细介绍:【C语言】第四课 指针与内存管理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...
知识点错题整理
1:【子串里面包含空串】12+1=13【一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串 abcab 有(13 )个内容互不相同的子串】...
202311_陇剑杯预赛_tcpdump
流量分析,应急响应Tags:流量分析,应急响应 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202311_陇剑杯预赛_tcpdump.zip题目描述:攻击者通过暴力破解进入了某Wiki 文档,请给出登录的用户名与密码,以:拼接…...
Linux学习记录(六):添加/删除用户
添加/删除用户 sudo useradd -m -d /home/newuser -s /bin/bash newusersudo passwd newuser新建/删除用户su: Super User即系统管理员 useradd: 新建用户 userdel: 删除用户 passwd : 修改密码...
python 链式调用 合并 __setattr__ __getattribute__ in nested object()
使用场景:bpy.types.Scene与bpy.context.scene部分功能重叠。 def Get(obj, attr: str | Sequence[str], root=False):"""injected recursive getattr, could pollute objects on chain in whole session"""IS_STR = isinstance(attr, str)if I…...
分享一个稳定好用的免费云服务——阿贝云体验
最近在搭建个人小项目,一直在寻找稳定的免费云服务器资源,偶然发现了「阿贝云」,用了几天感觉非常不错,特地来分享一下使用体验。 阿贝云提供了免费虚拟主机和免费云服务器,对于像我这样刚开始学习建站或者想做点小实验的用户来说非常友好。注册流程简单,开通也很快,控制…...
年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解
年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Couri…...
接口测试---PyMysql
PyMysql数据库操作代码安装 : pip install PyMySQL数据库应用场景校验测试数据 :http请求发送后,明确会修改表中的数据,但响应结果中没体现如删除员工(is_delete字段)构造测试数据 :测试数据使用一次就失效,不能重复使用 : 添加员工(手机号码字段)测试数据在展开测试前无法确定…...
My First Blog
被你发现啦~...
设置基础软件仓库时出错
1.安装源报设置基础软件仓库时出错2.点击【网络和主机名】,把网络设置成静态网络,能够访问外网3.点击【安装源】,在网络上这块输入这个网址 https://update.cs2c.com.cn/NS/V10/V10SP3-2403/os/adv/lic/base/x86_64/ ,之后点【完成】...
linux c应用性能与内存泄露问题排查工具
GCC内置的内存检测工具在 GCC 中,对 -fsanitize=address(AddressSanitizer, ASan)、-fsanitize=leak(LeakSanitizer, LSan) 和 -fsanitize=memory(MemorySanitizer, MSan) 的支持情况如下:-fsanitize=address(AddressSanitizer - ASan)支持:是可用版本:…...
深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略
深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...
VS Code快捷键
VS Code 1.通用操作快捷键快捷键 功能Ctrl+Shift+P 打开命令面板Ctrl+Shift+N 新建窗口Ctrl+S 保存Ctrl+P 搜索打开文件2.代码编辑快捷键快捷键 功能Ctrl+Z 撤销Ctrl+Shift+Z 反撤销Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+F 查找Ctrl+H 替换Ctrl+A 全选Shift+Alt+F 格式化代码…...
API安全厂商综合推荐:2025年权威视角下的主流厂商评估与选型指南
API安全厂商综合推荐:2025年权威视角下的主流厂商评估与选型指南基于IDC 2024年度报告,推荐全知科技、奇安信、腾讯云、华为、保旺达,启明星辰、安恒信息,安华金和、美创科技等API安全厂商,适用于金融、政务、运营商等行业客户,支持AI赋能运营提效70%、资产发现纯净度95%…...
基于FPGA的8PSK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印):设置SNR=10db设置SNR=30db仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要随着通信技术的不断发展,相位调制技术因其高频谱效率和抗干扰能力而广泛应用于无线通信系统中。其中,8PSK(8相位…...
去去就来
一脚踢开也许从来没有面临过 看着天空就要泪流下 不是为了具体的人 不是为了具体的事 或者说 每个人都是凶手 下雨这天好安静 也不再盼望放晴 扭转时空又如何挽回 时差 禀赋没有破土 在一切都爆发之前 万物缄默 不甘与嫉恨 人性共扭曲 下位者的祈愿 愿你跌入深渊 所谓的思维 究…...
高三试卷
福建省2024-2025学年高三年级下学期模拟(一模&二模&三模)物理试题试卷汇总 https://www.zxxk.com/docpack/3497855.html...
豆包生成C#即梦API HTTP调用实例代码
最近玩即梦AI,文生图,文生视频等等很多玩法都很强大。即梦本身页提供了API。官方文档里有Java, Golang, Python, PHP的SDK,官方也推荐使用SDK,调用SDK会比较省事儿。官方也提供了HTTP请求示例代码,但是也只包括Java, Golang, Python, PHP,没有C#。所以就尝试写个C#调用即…...
解析几何笔记
记号约定:\(\displaystyle {x \brack y}\):向量 \((x, y)\)。1. 直线 一些定义:方向向量:与直线 \(l\) 平行的向量。 倾斜角:直线 \(l\) 与 \(y\) 轴正方向同向的方向向量,与 \(x\) 轴正方向的夹角。形式化的,设直线 \(l\) 的方向向量 \(\bold{v}\) 满足 \(\displaystyl…...
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
1.课题概述 基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真,通过SOA优化PID的kp,ki,kd三组参数,对比普通的PID控制器的控制效果。 2.系统仿真结果 3.核心程序与模型版本:MATLAB2022a%使用优化后的参数控制PID控制器 for k=1:10000time(k) = k*ts;%设定…...
使用 CUDA 12.9 编译 PyTorch 2.4.0
最近跑的一个项目需要 torch==2.4.0,但是 GPU(NVIDIA RTX PRO 6000)需要 CUDA 12.9,PyTorch 官方这个配置的预编译包,因此需要手动编译。获取源码: git clone -b v2.4.0 --depth 1 https://github.com/pytorch/pytorch cd pytorch git submodule sync git submodule upda…...
详细介绍:boost::circular_buffer的使用方法简介
详细介绍:boost::circular_buffer的使用方法简介pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
1.程序功能描述 基于禁忌搜索算法的TSP问题最优路径搜索,旅行商问题(TSP)是一个经典的组合优化问题。其起源可以追溯到 19 世纪初,最初是在物流配送、线路规划等实际场景中被提出。简单来说,给定一组城市和城市之间的距离,旅行商需要从一个城市出发,访问每个城市恰好…...
PDD9.14 笔试 - 浪矢
目录Day1 T1Day1 T4 Day1 T1 简单的模拟: 题目内容大概是给一个字符串a,a的子串拼成字符串b。 例如abcd -> abbccd 给你b字符串,要求给出a字符串。 思路:b字符串中除了第一个字符和最后一个字符串外,其他的都是重复字符,隔一个选一个就好。点击查看代码 import java.u…...
增肌,减脂,变瘦的联系和区别
首先,健身的目的基本都是为了好看的体型,肌肉和脂肪匀称的占比,力量和丝滑的结合。如果是运动员或需要针对性训练肌肉的话,那另说。 其次,这里说一下饮食和训练的关系。 俗话说,三分练七分吃。很多人不理解,为什么吃这么重要,但是我各种营养餐,减脂餐,轻食,没少吃,…...
(eval):1: _python-argcomplete: function definition file not found
(eval):1: _python-argcomplete: function definition file not found 我在使用kali的时候每次想使用table键补全命令就会报错,很烦人就是 去网上搜了一下,终于找到了解决方法argcomplete是一个用于Python的命令行参数自动补全工具。它通过与argparse库结合,为Python应用程序…...
详细介绍:【Spring Boot 报错已解决】Web server failed to start. Port 8080 was already in use.
详细介绍:【Spring Boot 报错已解决】Web server failed to start. Port 8080 was already in use.pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…...
Nordic Neuton.AI 技术优势;
Nordic Neuton.AI 技术的主要优势包括: 极小模型体积 Neuton.AI 能自动生成极小的机器学习模型,通常仅需几 KB(平均小于 5 KB),比传统框架(如 TensorFlow Lite for Microcontrollers)小 10 倍以上。 自动化建模,无需 ML 专业知识 Neuton.AI 平台无需开发者具备神经网络…...
channel Sounding 工作流程
1、必须要建立连接,并且配对绑定模式; 2、通过发送LL_CS_CONFIG_REQ PDU Select “启动器(Initiator) 或 反射器Reflector; 3、LL_CS_CONFIG_RSP PDU Select “与 DEVICE A 相反的角色 ” 4、启动器( Initiator )和反射器都可以发起channel sounding的流程; 如果对这个…...
基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
1.算法运行效果图预览 (完整程序运行后无水印)将数据导入到matlab中显示图片:可以看到,图3,通过FPGA细化之后,可以获得和MATLAB一样的效果(图2),两者相对于原图(图1)都实现了图像的细化处理。2.算法运行软件版本 vivado2019.2matlab2024b/matlab2022a3.部分核心程序 (…...
channel Sounding RTT和PBR 属性总结
1、蓝牙联盟规定了有72个信道可以使用,每个信道带宽1M; 2、跳频模式和普通ble 跳频方式是不一样的; 3、channel Sounding 必须要是建立连接的; 4、角色分为启动器和反射器; 6、启动器:计算自身到另一个设备的距离 7、反射器:对启动器进行响应的设备; 8、跳频机制和我们普…...
二分查找方法
/*二分查找方法,前提是这个数组是有序的,无序的先排序 1-100; 50 25 判断结构,循环结构(比较),区间为零时找完,则没有找到 / //public static boolean binarySearch(int[]array,int target) //{//定义左右坐标 // int left=0; // int right=array.length-1; /因为…...
复制一个数组的方法
public class DemoArray { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5}; int[] array1 = new int[array.length]; // for(int i:array){//特殊方法(遍历数据的时候),只需要输出数据的时候使用 // System.out.println(i); //…...
判断目标是否在数组里面
public static boolean fiandTarget(int[] array,int target){ // boolean flag = false; for (int i = 0; i < array.length; i++) { if (array[i] == target){ return true; //flag = true; } } // return flag; return false; }...
选择排序方法
public static void chooseSort(int[] array){for (int i = 0; i < array.length - 1; i++){//记住索引位置int min = array[i];int minIndex = i;//开始内存比较for (int j = i+1; j < array.length; j++) {// 如果发现比标志的小的,就将赋值给标志位if (array[j] <…...
ArcGIS Pro 遇到严重的应用程序错误而无法启动 - 教程
ArcGIS Pro 遇到严重的应用程序错误而无法启动 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...
第一次作业
大家好我日常有三个常做的事:刷视频、玩游戏、偶尔画画。刷视频时,我不只是看娱乐内容,遇到 “Python 基础操作”“PS 简单修图” 这类实用知识,会随手存到收藏夹,每周还会抽 1 小时把零散知识点整理成笔记,现在已经攒了厚厚一本,之前帮同学修图时,还从笔记里找到过调整…...
markdown文件上传到博客园教程
如何将Markdown文件上传到博客园文本内容 图片资源前期准备 vscode软件下载并安装vscode软件安装博客园插件并登录账号在vscode中,通过搜索栏搜索并安装博客园插件,插件名称为:博客园cnblogs客户端,安装后重启vscode软件。登录账号登录成功后可以上传到博客园markdown文件上…...
自我介绍
大家好,我是 谢燚欣 一名来自数据科学与大数据技术专业的学生,很高兴加入博客园以及接下来对我的学习过程进行记录。在学习之外,我还有一颗好奇和勇于尝试的心。当我对滑滑板和滑雪很好奇时,我就会去尝试它们,尽管每一次的摔跤都伴随着剧烈的疼痛,那是也阻挡不了我对它的…...
【展厅多媒体】从技术到体验,AR在展厅中的一体化整合 - 指南
【展厅多媒体】从技术到体验,AR在展厅中的一体化整合 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...
LilCTF 2025
Qt_Creator Solve 通过字符串找到槽函数sub_410100()发现判断点为this == v21,直接动调(附加)到这个地方取值就行(跳过下面部分)根据字符串找到注册信号的位置向上翻找到该类的this指针What I have learned此题不止在demo_code_editor.exe执行过程中存在反调试,在加载库时应该也…...
AES算法原理与举例说明
AES算法原理与举例说明AES( Advanced Encryption Standard,高级加密标准 )是当前全球主流的对称分组密码,用于替代安全性不足的 DES,广泛应用于 HTTPS、文件加密、物联网通信等场景。其核心特点是分组长度固定为 128 位,密钥长度支持 128 位、192 位、256 位(对应算法称…...
ffplay音频重采样 - 教程
ffplay音频重采样 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size:…...
devexpress gridcontrol表格知识
过滤 高亮显示 ,不过滤非匹配行行选择,单行编辑 活动行着色 保存...
深入解析:Qt串口通信学习
深入解析:Qt串口通信学习pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...
字符串算法笔记
记号约定:\(|s|\):字符串 \(s\) 的长度。 \(\mathbb{S}\):字符串集。 \(\Sigma\):字符集。一些约定:下标从 \(0\) 开始。1. 哈希 1.1 定义 我们想要快速求出字符串 \(s\) 是否等于 \(t\)。 如果 \(|s| \neq |t|\),那么一定不相等,所以令 \(|s| = |t| = n\)。那么有 \(O(…...
【光照】Unity[经验模型]和[物理模型]
Unity URP(Universal Render Pipeline)中的光照模型BRDF(双向反射分布函数)是PBR(基于物理的渲染)的核心组成部分,用于模拟真实世界的光照交互。【从UnityURP开始探索游戏渲染】专栏-直达一、BRDF发展历史(时间线)1971年:Bouknight提出首个光反射模型,引入Lambe…...
实用指南:浅聊一下Redisson分布式锁
实用指南:浅聊一下Redisson分布式锁pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...
JavaScript起源
为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门:HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 控制了网页的行为本教程是关于 JavaScript 及介绍 JavaScript 如何与 HTML 和 CSS 一起工作。谁适合阅读本教程? 1. 如果您想学习 J…...
9.14做题随记
OI学习,宁可不学不可逆向,要么知道题目怎么做后学习代码写法,要么知道代码基础学习题目怎么做,要么两种都会学习另外一种解法,万万不可逆向学习,费心费力。P1678 烦恼的高考志愿 题目背景 计算机竞赛小组的神牛 V 神终于结束了高考,然而作为班长的他还不能闲下来,班主任…...