【C/C++教程】指针,指向何方?

2021/6/6 1:23:42

本文主要是介绍【C/C++教程】指针,指向何方?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一说到指针

可能大家的心里

就不止一句mmp要讲了

各种***号让人欲罢不能

 指来指去指到你怀疑人生

各种停止运行简直扎心

各种函数指针,数组指针

简直不能再骚

传说最难,还没有之一

那么,指针究竟为何物?

有那么难?难以上青天?

容我说一句

传说终究是传说

今天就来跟大家简单聊一聊

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

何为指针?

指针并不神秘,理解指针

我更推荐从本质上去理解

什么是指针?

一种数据类型

既然是数据类型

就跟int,float,double一样

可以用来定义变量

那么,这种类型的变量存的是什么?

内存地址

对,我们要时刻牢记这两点

指针是一种数据类型

这种类型的变量存的是内存地址

我觉得很多人不理解指针

无非就是,不理解内存地址

然后将值和址的关系搞混

所以,在这里有必要跟大家科普一下

内存地址的相关知识

简单来说,内存可以简化为下面的模型

当然,这只是为了方便说明问题

实际内存的划分还是蛮复杂的

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

内存是干嘛的?

单纯点,存数据的呗

内存是由很多很多比特位组成的呀

比特位是什么呢?二进制位嘛

通电时为1,不通电时为0

比如下面这个图

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上面就是一排过去的比特位

每个位只有两种状态0 or 1

那么,我们规定

一个字节=8个比特位

然后将内存中排列的比特位

按照字节来编号

于是,有了下面这张图

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

于是,重点来了

这里的编号

其实就是我们上面说的内存地址

那么指针就是用来存这玩意儿的

(0x表示十六进制,再问自杀)

所以,数在内存中

就是这么存的呀

比如18二进制是‭00010010‬

就是像上面一样丢进内存的

(实际存储中,整数,

小数都有自己的一套方式,

比如整数是补码形式存的,

这里就不展开了。)

经过上面的简单叙述

相信大家对内存地址有了一定的了解

对于指针

我的建议还是抓住本质

指针是什么?一种变量类型

这种类型的变量存的是什么?

内存地址

至于教科书上那些

房子和地址什么的

忘了它吧......

理解地址和变量名的关系

先来看看一个例子吧

int a = 100;这是干什么呢?

定义一个int类型的变量

定义变量嘛,就是告诉系统妈妈

我要存一个整数100

你给分配一块内存出来

那好啊,内存分配出来了

但是怎么找到它呢?这个简单

直接通过变量名去找嘛

但是系统妈妈还给了一种方式

她还给了我们一个内存地址

比如下面的这个

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


假如给我们的变量a的地址是0x77FFA,但是不对啊

int不是占4个字节吗?0x77FFA指向的内存空间

不是只有一个字节吗?

哎,起始地址嘛。为什么指针类型有int*,float*等等?

就是告诉你,我存的是一块内存区域的起始地址

这块区域有多大?取决于类型嘛


然后,int *p = &a;这又是干啥呢?

抓住两点,p是什么?指针类型的变量

p存的是什么?变量a的地址呀

于是乎,p便指向了变量a

(&a表示取a的内存地址,再问自杀)

于是,我们有下图:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

然后,我们就可以通过指针p来访问a了


*p = 99;这又是什么意思?

*和指针变量结合

就是访问指针变量指向的那块内存空间嘛

然后通过这种方式

我们就可以把99重新放进0x77FFA这块内存空间里

然后a的值就相应修改为了99

好了,通过上面的例子

我们了解到了指针的本质

其实对于什么指针数组,数组指针

函数指针等等

抓住其本质,多加练习也很容易明白


总之,最大的难点就是,区分

指针变量,和指针变量指向的那块内存



指针有何用

很简单粗暴的一个例子

外挂怎么做的

金钱肯定是变量存的吧

那你找到那个变量的地址

想怎么改就怎么改

呃......当然指针不是这么用的

当初学C的时候

也在烦,既然有变量名

为什么还要整个指针这蛋疼的玩意儿

后来遇到了数组

只需要数组名+下标就可以轻松访问数组中的某个元素

其实大家都知道,数组名+下标其实相当指针+偏移,

第一次感受到指针的威力

再后来遇到函数

传指针可以修改函数外的变量

不由得对指针的好感大增

再再后来学了数据结构

被结构体通过指针环环相连的美感彻底征服

在茫茫的内存大海中

是指针将我们相互连接起来

无论对象被new到了哪里

我总能找到你

这才是指针


1

END

1

后记:尽管很罗嗦,以上纯属个人不成熟的理解。如有错误,谢谢指正!也希望能带给大家一点小小的帮助!




这篇关于【C/C++教程】指针,指向何方?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程