写在最前

作为在贵乎的第一篇文章吧... 允许我加点废话(求轻喷...

应该是从19年的下半年开始,虽然顶着算法工程师的title,但做的很多事情都是开发了,然后19年12月跳槽之后,到了新的环境并开始专心做SLAM方向的事情,基本全部的时间都在做开发相关的事情,长时间使用ros和cpp,同时又入了cuda的坑,但整体来说节奏还算比较舒服的 (这难道就是传说中的贱么 ...

就,长时间的闷头开发,但很多次发现一些基本基础知识并不是很牢固,很多甚至都不清楚,然后还是觉得,工作归工作,确实是需要找点时间精力去对一些东西做记录、回溯,而这个过程中也能学到很多之前疏忽的东西,也很多次对之前的疑问有种豁然开朗的感觉,所以就慢慢习惯了...

这个笔记的话,其实我自己做了很久,很多东西都先放在公司内网空间了,有些在OneNote(这个主要是master阶段用的,各种花式上课面试刷题笔记啥的都往上放),而有些在印象笔记。

而在贵乎的话,还是会慢慢抽时间加点文章上去,肯定有自己总结学习不正确的地方,也希望大佬们花式留言批评... 当然了如果能有幸帮到一些人,我也是很荣幸的

哦对了,关于标题的话,会参照下述格式

【开发/算法/其他 笔记分类】- 【第一级范围,比如cpp或者ros啥的】- 【第二级范围,比如cpp中的指针或者ros中的CMakeList啥的】- 【第三级的序列号和具体内容主题】

以上

正文ing

ok,圆规正转。

其实要真正掌握指针(这话是不是说的有点大了..... 那改成学习 学习指针

脑子里需要有计算机内存结构的概念。在计算机语言中,任何的符号(变量、函数、指令等)都需要分配到其对应的内存区并按照一定格式存储,然后再进行一系列的运算等。

我们先来介绍关于指针的基本属性,

  • 指针属于变量,和其他int/float/double等类型一样,会占用内存空间
  • 指针变量既然被分配了空间,那其本身就会有自己的存储地址
  • 指针变量的值,也就是指针本身存储的值,会被编译器当做是地址,而不是一般的数值
  • 在32位的平台里,由于指针变量的值是地址,因此指针会占据4个字节的长度
  • 指针类型决定于定义的时候,比如,int *p 则表示指针p的类型是 int* (p.s. 从语法的角度看,你把指针声明语句里的【指针名字】去掉,剩下的部分就是这个指针的类型)
  • 指针指向的类型取决于其指向的那个内存空间中的类型,比如,int *p 则表示该指针指向了int类型 (p.s. 从语法上看,把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型)
  • 符号 * 的作用是取出指针指向其内存地址中的内容

当然了,光看上述文字,一般都是看了就忘的...

下面用一个实际的例子来加深印象,也提供一个我自己在针对指针问题上常用的示意图,

int b = 10;     // 初始化整型变量
int *a;         // 初始化指针
a = &b;         // 将变量b所在的地址赋值给指针a

然后附上一张内存的演示图,如下,

ok,现在结合这张图来解释上面的属性介绍,

  • int *a 定义了指针类型为 int*
  • int *a 定义了该指针指向的是一个整型int
  • a为指针的名称,内存中为a开辟了一个变量空间,如图中a后面的方块
  • 内存空间为整型b开辟一个空间,其地址为B,其值为10,如图中b后面的方块
  • 指针a有其自己的地址,这里记做A,但此时地址A中的值不确定
  • 根据表达式,将b的地址赋值给指针a,因此,指针a中的内容,存放的是b的地址,即为B
  • *a即可代表指向b变量,这样的话,若*a = 12,则b的值也将会变为12

相信结合这张图,能够对指针有一个较为直观的理解,其实基本上当搞不清指针的问题时,都可以借助上述类似的内存图来进行分析,找到每个位置对应的变量即可。

再举个例子,引入一个稍微复杂点的双指针,在上面的基础上,

int **c;
c = &a;

大家很多都看到双指针就有点懵了,但其实结合示意图的话,会清晰不少,如下

  • int **c 定义了指针类型为int **
  • int **c 定义了该指针指向的类型为一个整型的指针,即int *
  • &a 的操作得到指针a的地址,这里即为A
  • c = &a 即实现将c指向a,所以c的值为a的地址A,即指向指针类型,另外c本身的地址是C
  • *c == *(&a),即指向指针a,a中存储整型b的地址
  • **c == *(*(&a)),即指向整型b
  • c ++,实现的是其存储的值++,也就是地址A++,这个就改变了c的指向,指向a地址高处
  • (*c) ++,实现的是a中存储值++,也就是地址B++,这个就改变了a的指向了,指向了b地址的高处
  • (**c) ++,实现的是b中的值++,也就是b == 11

p.s. 这里要说明一下,上述例子中指针和地址相关的++或者其他运算符号,和正常的运算符操作不一样,还要涉及到其本身的类型和其指向的类型等,这个部分在之后的章节中详细介绍。

ok,关于这个部分,希望可以通过上述的两个例子帮助了解什么是指针,包括指针的内存模型,之后面对其他的指针相关问题的时候也可以借助类似的模型图去解决。

最后ing

这个是我自己笔记中的关于指针的第一部分内容,如果出现了一些错误,也希望大佬们疯狂指出,当然也欢迎大家有兴趣的可以留言讨论

以上

c 指针地址 突然改变_开发笔记 - Cpp - 指针 - 1.1 如何理解指针相关推荐

  1. Cortex-A53 从裸机开发_开发笔记(64位)

    Cortex-A53 裸机开发笔记 硬件环境:创龙 imx8mm 开发板 软件开发环境:DS5 成功将 RTT 移植到 Cortex-A53 架构板子的源代码工程 1. uboot 的 bootelf ...

  2. 编程获取ip地址与mac地址的对应关系_[读书笔记]CSAPP:25[VB]网络编程1

    视频地址: [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com 课件地址: ...

  3. 小程序mpvue图片绘制水印_开发笔记:使用 mpvue 开发斗图小程序

    之前用过 wepy 框架写了个小程序 GitHub - yshkk/shanbay-mina: 基于 wepy 框架的 "扇贝阅读" 微信小程序 ,感觉写法上类似 vue,但不那么 ...

  4. 如何通俗的理解函数的极限_(高等数学笔记)萌新也能理解的函数极限求法

    距离上一个笔记已经隔了快一年了,没想到还有那么多小伙伴能看到还点赞,太感动了.那刚好我顺便把求极限的方法一并写下,希望对大家有帮助,我会尽力用萌新都能看懂的语言告诉大家. 基础:首先需要知道,多项式, ...

  5. C和指针_第16章_标准数函数库_学习笔记

    1.整型函数 这组函数返回整型数值.分为算术.随机数和字符串转换 1.1算术<stdlib.h> int abs( int value ); long int labs( long int ...

  6. printf 指针地址_数组指针和指针数组

    首先,理解一下数组指针和指针数组这两个名词: 数组的指针:是一个指针,什么样的指针呢?指向数组的指针. 指针的数组:是一个数组,什么样的数组呢?装着指针的数组. 然后,需要明确一个优先级顺序:()&g ...

  7. printf 指针地址_指针搞都不懂,好意思说自己会C语言?

    C语言面试必问知识点之「指针」 一.指针相关概念 指针与地址 我们使用的计算机,系统为了更好地管理我们的内存,就为内存区的每一个字节都分配一个唯一编号,这就是"地址". 指针的实质 ...

  8. springboot thymeleaf配置_【程序源代码】Spring Boot 开发笔记web开发实战1

    关键字:<Spring Boot 开发笔记>系列文章 各位亲爱的小伙伴:大家好! <Spring Boot 开发笔记>系列文章 这套笔记和源码是我自己在学习springboot ...

  9. Linux高并发服务器开发---笔记1(环境搭建、系统编程、多进程)

    0613 第4章 项目制作与技能提升 4.0 视频课链接 4.1 项目介绍与环境搭建 4.1.1 项目介绍 4.1.2 开发环境搭建 ①安装Linux系统.XSHELL.XFTP.Visual Stu ...

最新文章

  1. 转--Android如何在java代码中设置margin
  2. java 编写命令行工具_编写命令行工具
  3. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.18. 数组函数和操作符...
  4. liferay-ui:search-container 用法
  5. 模拟 http connecttimeout_燃烧室数学模型模拟软件NPSS
  6. 单片机实验:数据区传送程序
  7. 寻求有用的Eclipse Java代码模板[关​​闭]
  8. 投影仪融合+拼接处理系统制作原理
  9. 后缀树系列三:后缀树的应用
  10. 核心期刊为什么难发?
  11. 【实验技术笔记】细胞表型检测之细胞周期(PI 染色)
  12. 《此生,若你安好.便是晴天》 -- @ShinePug
  13. 中药材经营需要哪些证件
  14. MySQL编程:将查询到的字段赋值给变量
  15. 自媒体推广应该怎么入手,如何去做
  16. 十大经典三维动画制作软件
  17. 温度传感器LM35实验
  18. k8s-卸载K8S集群
  19. (转)【如何快速的开发一个完整的iOS直播app】(原理篇)
  20. Java替换.docx文件中标记地方的内容

热门文章

  1. 【Vue】Vue入门 -(本地篇+网络篇)代码示例及运行效果
  2. 【Python】选择Python2还是Python3?
  3. 【MySQL】ON DUPLICATE KEY UPDATE 解决重复插入问题
  4. C 语言结构体_点运算符( . )和箭头运算符( - )的区别
  5. Spring Boot中配置文件application.properties使用
  6. 操作系统(3) -- 内存管理
  7. 想满分的看这里:1015 德才论 (25分)
  8. eclipse怎么导出一个Java项目(莫要错过,最详细教程!)
  9. Nginx配置统计页面及访问控制(htpasswd和客户端IP)
  10. 使用DLL进行不同语言之间的调用