精华写在前头
首先将最主要的两点给大家在这里先将一下。在指针里面有两个符号很重要,一个就是“*”号,一个就是“&”。大家记住这两点就行:变量前加“*”就是取值,变量前加“&”就是取地址。
另一种方式去理解指针
我们先来看一下指针变量怎么初始化和赋值:
不知道有多少小伙伴是这种写法:这种写法我是这样理解的‘int’是类型*p把他整个当成变量所以后面*p = b的写法就跟普通int变量赋值是一样的*p = b其实可以看成类似a=b这种赋值过程
其实我个人不怎么喜欢这种写法,我的写法如下:
大家注意我鼠标选中的那一行,我将int *p 写成了int* p,其实这两种写法用起来是一模一样的,但是我觉得这种写法更容易去理解指针:我将int* 整个当成一个一种类型,就更int、string这种类型是一样的,只不过int* 是指地址類型,而int是整型的变量。现在很好理解了吧。p是一个地址变量,那么初始化我们是不是也应该给他一个地址呢?所以int* p = &a;
然后第13行*p = b ;p是一个地址变量,我前面也讲到过“*”号是取值,就是取p这个地址存的值,p的地址存的值是整型的,b的类型也是整型,符合=号左右两边类型相等原则,可以赋值。运行代码的结果是:
200:
二级指针的理解
好,接下来我们呢去复杂情况下运用指针看下我们的理解能不能行的通。好,接下来,更头疼的二级指针来啦!
从第15行看起:我还是用我喜欢的写法去写的。来,我们一起去捋一捋。我又将int** 当成是一个类型(他是“地址的地址”类型),把p2当成是变量。那么第16行,为了让等式左右两边类型相等,p是指向的a的地址对吧,本身p也是一个变量,他本身也有地址,所以将右边也转为int**类型,就是地址的地址类型,怎么做呢?很简单啊,前面讲过啊,“&”代表取地址啊所以p2 = &p;
然后我们看输出项:*p2是什么意思呢?再提一次,前面讲过“*”代表取值,那么*p2代表的意思是取p2指向的地址的值,是什么呢?不就是p的地址吗?
那么**p2呢就很简单了,就是取p的地址指向的值啊。
所以输出结果就是:
其中第一个输出结果由于是地址,地址是系统自动分配的,所以每次运行会不一样!
理解了这些后什么三级、四级也是一样的理解,层层剥开就好了。
图解
给大家一张图,大家去理解吧:
简单讲一下,程序在运行时碰到int* p会给p开辟一个空间,p会拥有自己的内存地址,但是p本身指向的是变量b所在内存的值也就是200,同理运行到int** p2时也会给p2开辟自己的内存地址,但是他指向的是系统分配给变量p的地址~
【总结一句话给大家:指针变量就是自己住着狗窝却去操心别人家的黄金屋(自己占用很小一块内存,却能指挥很大一块内存)】