指针, C语言的精髓
指针, C语言的精髓
莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA, 树剖求 LCA 比倍增求 LCA 常数小).
什么是指针
保存变量地址的变量叫做指针.
这是大概的定义, 但是Defad认为这个定义不太好理解, 所以我们先不看.
我们的电脑里都有随机存储器 RAM 也就是内存条, 所有变量和数组都在这里, 这个应该大家都知道.
那么我们把内存条看成数组, 头地址显然是 0
.
这也解释了为什么不能用
NULL
, 因为一般不用数组第 00 个.
那么现在我们有一个整数变量 x
.
int x; |
这个 x
在内存条哪里呢?
&
可以获取变量在内存条的下标, 所以 x
的下标是 &x
.
那么我们怎么访问内存条的第 &x
项呢?
刚才我们说, 内存条头地址是 0
, 根据数组访问的方法, 可以想到用 0[&x]
访问变量 x
.
我并不是在瞎写, 我只是觉得这样比较好理解, 真正用的时候写这个的应该腰斩.
那么我们现在用一个变量存储这个 x
的下标.
int *p = &x; |
int*
类型表示保存 int
类型变量在内存条里的下标的变量.
所以我们可以用 p
代替 &x
就是 0[p]
.
但是我们现在有一个语法糖.
*p
就是表示 0[p]
, 因为数组访问的本质是指针移动, 比如 a[3]
实际上是 *(a + (3))
.
所以我们可以用 *p
来访问在内存条里 p
保存的下标.
同理 *&x
也一样, 但是你变量都在这了就不需要取下标再访问下标了.
指针能干什么
我们有一个栈存储我们调用的函数和函数内部开的变量, 叫系统栈.
但是这样带来的问题就是我们给函数传入的变量是把值传进去了, 函数并不知道是要对值更改还是对变量本体更改.
现在有了指针就好办多了.
比如写一个交换函数.
void exchange(int *x, int *y) { | |
*x ^= *y; | |
*y ^= *x; | |
*x ^= *y; | |
} |
就可以传入地址后在内部做交换.
刚才如果我没提到什么是地址, 那就是在内存条的下标了.
还有, 我们可以申请一块内存, 使用完再释放掉.
// 申请, 这里要强转成目标类型 | |
int *a = (int*)malloc(sizeof(int) * 100); | |
// 这里做点什么 | |
free(a); // 释放 |
申请来的可以当数组用, 也可以当变量用, 需要指针访问 (类似 *p
).
比如平衡树的一个结点, 插入时申请一个, 删除时释放掉.
这样其实相当于一个垃圾回收机制.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2021-12-24 NET Core DI 手动获取注入对象
2019-12-24 .NET Compiler Platform,一个.NET编译平台
2018-12-24 微软开源的Trill是什么?
2018-12-24 浅谈SQL Server---2
2018-12-24 浅谈SQL Server---1
2017-12-24 net Core 2.0应用程序发布到IIS
2017-12-24 PHP是.NET上的一门开发语言