指针, C语言的精髓
指针, C语言的精髓
莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA).
什么是指针
保存变量地址的变量叫做指针.
这是大概的定义, 但是Defad认为这个定义不太好理解, 所以我们先不看.
我们的电脑里都有随机存储器 RAM 也就是内存条, 所有变量和数组都在这里, 这个应该大家都知道.
那么我们把内存条看成数组, 头地址显然是 0
.
这也解释了为什么不能用
NULL
, 因为一般不用数组第 \(0\) 个.
那么现在我们有一个整数变量 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
).
比如平衡树的一个结点, 插入时申请一个, 删除时释放掉.
这样其实相当于一个垃圾回收机制.
垃圾回收机制是说比如平衡树删除一个结点时下一个新建结点直接用刚删掉的结点拿过来.
指针, C语言的精髓的更多相关文章
- 二维数组和指针(C语言)
二维数组和指针 二维数组和指针1.二维数组和数组元素的地址若有以下定义:int *p, a[3][4]; 1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的 ...
- C指针——C语言手记
近期敲代码的时候.发现自己非常多东西都開始忘了. 今天最终有机会好好总结一下指针.当做个笔记同一时候也希望对大家实用.假设有不对的地方.希望大家能帮我指正一下.然后我的实验环境是32位RHEL+ecl ...
- C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数
1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technici ...
- 指针C语言
一.PTA实验作业 题目一:6-7输出月份英文名 1.PTA提交列表 2.设计思路和流程图 这题只需补充子函数,定义指针数组month[12],分别从一月到十二月,再定义一个字符,让它为NULL,当输 ...
- (二)羽夏看C语言——容器
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...
- iOS开发系列--C语言之指针
概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 ...
- 不懂指针就不要说自己学过C语言!
不懂指针就不要说自己学过C语言! 1.掌握了指针,就掌握了C语言的精髓!计算机中绝大部分数据都放到内存中的,不同的数据放到不同的内存区域中. 内存角度没有数据类型,只有二进制:数据以字节(8位二进制) ...
- 黑马程序员_ C语言基础之指针(三)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...
- 从汇编来看c语言之指针
一.基础研究 将下面的程序编译连接,用debug加载: 首先执行第一条语句: 发现p=(unsigned char *)0x1000;在这里是把1000赋给一个偏移地址为01af.大小为两字节的内存空 ...
- 娓娓道来c指针 (0)c语言的梦魇:c指针
(0)c语言的梦魇:c指针 序 c语言中有一个重点:c指针.它也是一个难点.当然,这是一句废话:重点往往也是难点.在c标准中,对指针的定义是这种: 指针的类型是derived from其他类型,也就是 ...
随机推荐
- 十种SQL的语法
一.ORDER BY FIELD()自定义排序逻辑 ORDER BY FIELD(str,str1,...) 自定义排序sql如下: SELECT * from order_diy ORDER BY ...
- 【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化
[QT性能优化]QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化 简介 本文使用QT树状控件QTreeView快速展示SQLite数据库中的1000万条具有层次结构的数据记录,当 ...
- 队列之ring_buffer优雅实现--附个人代码理解
1. 下面张贴实现该队列仅需的两个头文件:ring_buffer_iterator.h 和 fifo_iterator.h ring_buffer_iterator.h 1 /* 2 * 3 * Th ...
- “全栈合一 智慧运维”智和网管平台SugarNMS V9版本发布
以"管控万物 无所不能 无处不"在为产品创新理念,智和信通打造"全栈式"网络安全运维平台-智和网管平台SugarNMS.立足数字化.智能化.可视化.自动化,整合 ...
- 腾讯自研Git客户端,助力每个人都可以轻松使用Git
工具介绍 UGit是一款腾讯自研的Git客户端,为了让每个人都可以轻松使用Git,从而提高开发效率和团队协作的流畅性.支持工蜂MR/CR,工蜂议题管理,另外对于Git的原生特性有着深度支持. 支持的系 ...
- CSP 联训 3
好吧,又倒数了,就签了个 T2,100 pts. T1 我把相同颜色的存起来,每种颜色找出枚举选哪两个座位不合法的矩阵的左上和右下,如果找到的矩阵左下和右上也相同,则这个矩阵确实不合法,减去,但判断左 ...
- day01-markdown学习
markdown学习 标题 两个#号 三级标题 四级标题 字体 hello world!两个*加粗 hello world!一个*斜体 hello world!三个*斜体加粗 hello world! ...
- 开源之夏 2023|欢迎报名 Apache RocketMQ 社区项目!
开源之夏是由中科院软件所"开源软件供应链点亮计划"发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者,促进优秀开源软件社区的蓬 ...
- IDEA久违了!FeignX插件支持方法级别的导航跳转
> 需求调研:发现身边的同事追踪业务代码的时候,如果遇见feign接口,大家都是通过全局搜url进一步找到远程服务的实现.一旦项目大起来,路径变得复杂甚至重名之后,这将会是灾难. 市面上并没有很 ...
- ROS入门21讲(5)
九.服务数据的定义与使用 1.服务模型 2.自定义服务数据 Person.srv string name uint8 sex uint8 age uint8 unknown = 0 uint8 mal ...