指针, 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语言的精髓的更多相关文章

  1. 二维数组和指针(C语言)

    二维数组和指针 二维数组和指针1.二维数组和数组元素的地址若有以下定义:int *p, a[3][4]; 1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的 ...

  2. C指针——C语言手记

    近期敲代码的时候.发现自己非常多东西都開始忘了. 今天最终有机会好好总结一下指针.当做个笔记同一时候也希望对大家实用.假设有不对的地方.希望大家能帮我指正一下.然后我的实验环境是32位RHEL+ecl ...

  3. C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数

    1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technici ...

  4. 指针C语言

    一.PTA实验作业 题目一:6-7输出月份英文名 1.PTA提交列表 2.设计思路和流程图 这题只需补充子函数,定义指针数组month[12],分别从一月到十二月,再定义一个字符,让它为NULL,当输 ...

  5. (二)羽夏看C语言——容器

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  6. iOS开发系列--C语言之指针

    概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 ...

  7. 不懂指针就不要说自己学过C语言!

    不懂指针就不要说自己学过C语言! 1.掌握了指针,就掌握了C语言的精髓!计算机中绝大部分数据都放到内存中的,不同的数据放到不同的内存区域中. 内存角度没有数据类型,只有二进制:数据以字节(8位二进制) ...

  8. 黑马程序员_ C语言基础之指针(三)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...

  9. 从汇编来看c语言之指针

    一.基础研究 将下面的程序编译连接,用debug加载: 首先执行第一条语句: 发现p=(unsigned char *)0x1000;在这里是把1000赋给一个偏移地址为01af.大小为两字节的内存空 ...

  10. 娓娓道来c指针 (0)c语言的梦魇:c指针

    (0)c语言的梦魇:c指针 序 c语言中有一个重点:c指针.它也是一个难点.当然,这是一句废话:重点往往也是难点.在c标准中,对指针的定义是这种: 指针的类型是derived from其他类型,也就是 ...

随机推荐

  1. 解密Prompt系列38.多Agent路由策略

    常见的多智能体框架有几类,有智能体相互沟通配合一起完成任务的例如ChatDev,CAMEL等协作模式, 还有就是一个智能体负责一类任务,通过选择最合适的智能体来完成任务的路由模式,当然还有一些多智能体 ...

  2. 手脱upx

    其实已经是大一下刚开始的事情了,补个档 手动脱壳の新年快乐 查壳,有壳,UPX X32dbg打开文件,查看初始断点 点击PUSHAD跟进,CTRL+*设置EIP,开始F8步过,寻找ESP寄存器第一次单 ...

  3. ArgoWorkflow教程(五)---Workflow 的多种触发模式:手动、定时任务与事件触发

    上一篇我们分析了argo-workflow 中的 archive,包括 流水线GC.流水线归档.日志归档等功能.本篇主要分析 Workflow 中的几种触发方式,包括手动触发.定时触发.Event 事 ...

  4. word在原有的方框里打勾

    按住键盘上的ALT键不放,然后在小键盘区输入"9745"这几个数字,最后松开 ALT 键,自动变成框框中带勾符号.

  5. 【赵渝强老师】Oracle数据库的内存结构

    首先,我们通过一张图片来了解一下Oracle数据库的内存结构,如下: 每个数据库实例有两个关联的内存结构-系统全局区(SGA),程序全局区(PGA). 系统全局(SGA):一组共享的内存结构(称为SG ...

  6. 使用GRUB Multiboot2引导自制操作系统

    使用GRUB Multiboot2引导自制操作系统 前言 之前花了一周时间,从头学习了传统 BIOS 的启动流程.惊讶于背后丰富的技术细节的同时,也感叹 x86 架构那厚重的历史包袱.毕竟,谁能想到, ...

  7. 三维医学图像深度学习,数据增强方法(monai):RandHistogramShiftD, Flipd, Rotate90d

    #coding:utf-8 import torch from monai.transforms import Compose, RandHistogramShiftD, Flipd, Rotate9 ...

  8. ByConity与主流开源OLAP引擎(Clickhouse、Doris、Presto)性能对比分析

    引言: 随着数据量和数据复杂性的不断增加,越来越多的企业开始使用OLAP(联机分析处理)引擎来处理大规模数据并提供即时分析结果.在选择OLAP引擎时,性能是一个非常重要的因素. 因此,本文将使用TPC ...

  9. Kubernetes 升级不弃 Docker:KubeKey 的丝滑之道

    作者:尹珉,KubeSphere Ambaasador&Contributor,KubeSphere 社区用户委员会杭州站站长. 引言 随着 Kubernetes 社区的不断发展,即将迎来 K ...

  10. 在Lua中实现Rust对象的绑定

    实现目标:能将Rust对象快速的映射到lua中使用,尽可能的简化使用. 功能目标 以struct HcTestMacro为例: 类型构建,在lua调用local val = HcTestMacro.n ...