一说到指针
可能大家的心里
就不止一句mmp要讲了
各种***号让人欲罢不能
指来指去指到你怀疑人生
各种停止运行简直扎心
各种函数指针,数组指针
简直不能再骚
传说最难,还没有之一
那么,指针究竟为何物?
有那么难?难以上青天?
容我说一句
传说终究是传说
今天就来跟大家简单聊一聊
何为指针?
指针并不神秘,理解指针
我更推荐从本质上去理解
什么是指针?
一种数据类型
既然是数据类型
就跟int,float,double一样
可以用来定义变量
那么,这种类型的变量存的是什么?
内存地址
对,我们要时刻牢记这两点
指针是一种数据类型
这种类型的变量存的是内存地址
我觉得很多人不理解指针
无非就是,不理解内存地址
然后将值和址的关系搞混
所以,在这里有必要跟大家科普一下
内存地址的相关知识
简单来说,内存可以简化为下面的模型
当然,这只是为了方便说明问题
实际内存的划分还是蛮复杂的
内存是干嘛的?
单纯点,存数据的呗
内存是由很多很多比特位组成的呀
比特位是什么呢?二进制位嘛
通电时为1,不通电时为0
比如下面这个图
上面就是一排过去的比特位
每个位只有两种状态0 or 1
那么,我们规定
一个字节=8个比特位
然后将内存中排列的比特位
按照字节来编号
于是,有了下面这张图
于是,重点来了
这里的编号
其实就是我们上面说的内存地址
那么指针就是用来存这玩意儿的
(0x表示十六进制,再问自杀)
所以,数在内存中
就是这么存的呀
比如18二进制是00010010
就是像上面一样丢进内存的
(实际存储中,整数,
小数都有自己的一套方式,
比如整数是补码形式存的,
这里就不展开了。)
经过上面的简单叙述
相信大家对内存地址有了一定的了解
对于指针
我的建议还是抓住本质
指针是什么?一种变量类型
这种类型的变量存的是什么?
内存地址
至于教科书上那些
房子和地址什么的
忘了它吧......
理解地址和变量名的关系
先来看看一个例子吧
int a = 100;这是干什么呢?
定义一个int类型的变量
定义变量嘛,就是告诉系统妈妈
我要存一个整数100
你给分配一块内存出来
那好啊,内存分配出来了
但是怎么找到它呢?这个简单
直接通过变量名去找嘛
但是系统妈妈还给了一种方式
她还给了我们一个内存地址
比如下面的这个
假如给我们的变量a的地址是0x77FFA,但是不对啊
int不是占4个字节吗?0x77FFA指向的内存空间
不是只有一个字节吗?
哎,起始地址嘛。为什么指针类型有int*,float*等等?
就是告诉你,我存的是一块内存区域的起始地址
这块区域有多大?取决于类型嘛
然后,int *p = &a;这又是干啥呢?
抓住两点,p是什么?指针类型的变量
p存的是什么?变量a的地址呀
于是乎,p便指向了变量a
(&a表示取a的内存地址,再问自杀)
于是,我们有下图:
然后,我们就可以通过指针p来访问a了
*p = 99;这又是什么意思?
*和指针变量结合
就是访问指针变量指向的那块内存空间嘛
然后通过这种方式
我们就可以把99重新放进0x77FFA这块内存空间里
然后a的值就相应修改为了99
好了,通过上面的例子
我们了解到了指针的本质
其实对于什么指针数组,数组指针
函数指针等等
抓住其本质,多加练习也很容易明白
总之,最大的难点就是,区分
指针变量,和指针变量指向的那块内存
指针有何用
很简单粗暴的一个例子
外挂怎么做的
金钱肯定是变量存的吧
那你找到那个变量的地址
想怎么改就怎么改
呃......当然指针不是这么用的
当初学C的时候
也在烦,既然有变量名
为什么还要整个指针这蛋疼的玩意儿
后来遇到了数组
只需要数组名+下标就可以轻松访问数组中的某个元素
其实大家都知道,数组名+下标其实相当指针+偏移,
第一次感受到指针的威力
再后来遇到函数
传指针可以修改函数外的变量
不由得对指针的好感大增
再再后来学了数据结构
被结构体通过指针环环相连的美感彻底征服
在茫茫的内存大海中
是指针将我们相互连接起来
无论对象被new到了哪里
我总能找到你
这才是指针