目录
总
同一个地点,不同的时间,时隔一坤钟,我又来了。还是那句话:那年我双手插兜,不知道什么叫对手。错了,前面的是这个的基础建议先看前面两章。
这节课我们讲一讲:二级指针,指针数组变量,数组指针变量,三级指针,n级指针。字符指针变量,函数指针变量。8个好好看好好学。这个学会真的,我觉得你就很牛逼了
字符指针变量
我们在前面说了一个叫char*的东西记不记得,不记得也没关系,重开吧(从第一个开始看)记得的看这里,这个就是我们说的字符指针。他有什么用,他就访问一个字节的内存嘛。
一般我们的使用方法是
对不对,但是既然我又讲了,那他就是有别的用法,先看例题
啊……,这个是什么东西。呵呵这个就是pstr的另一种使用方法,他也可以指向字符串。
但是他指向的不是整个字符串啊,他只是指向了这个字符串的第一个字符(也就是h)是不是很简单。好,我们来一个难的例题
先别向下看,想好了再看
想好了吧
怎么样呢,有没有想到。现在我们来讲解一下。电脑会把常量字符串储存在一个单独的空间,当几个指针指向同一个字符串的时候,他们实际指向的是同一个地址,但是不同的数组就会开辟不同的空间。因此,就是结论了。
理解了吗,理解不了也没关系,因为这个是《剑指offer》上的一道面试题。理解不了,就不要面这个试了啊,说难听一点,就是必须理解,背下来,面试可能会用。
给大家讲了一个简单的知识,现在我们开始我们的重点(难点)
二级指针
前面我们学了指针,其实这个也可以叫一级指针,再来理解指针是指向什么的,噢,变量。(打过游戏的小伙伴都知道,装备是可以升级的,但是这个不叫升级叫进阶,科普一下升级就是单纯的把属性升级一下,战力微微提升,但是进阶就不一样了,进阶一般可以额外再加一个属性,战力大幅度提升,对不对,理解了吧,理解不了也没关系因为没什么用)我们本来有一个一级的指针是指向变量的,我们一直用他,把经验条集满了以后,他进阶了,变为了二级指针,你们猜一猜,他觉醒了什么技能,没觉醒,对就是没有觉醒。他变为了就比如一个武器可以打小怪的,进阶了一下变为了可以打玩家了。(一个可以打玩家的武器,是不是算神器)比如你在打游戏,你拿了一把极道帝兵,这个还是只能刷副本的,但是进阶了,这个武器可以打你了。(在计算机中,你拿武器是一级指针,变量是小怪,你打小怪就是一级指针指向变量,武器进阶了就是二级指针,打你,就是二级指针指向一级指针)而二级指针的值就是一级指针的地址
n级指针就是这样进阶下去。
数组指针变量和指针数组变量
数组指针变量,哈哈又有数组又有指针,什么东西啊。就像小日子(过的不错的日本选手),这句话的主题的小,还是日子。肯定是日子啊,不过他们确实小。这样理解数组指针是不是,肯定是指针啊,不过他们确实像数组。对不对。
是指针,又像数组,发挥想象力,是什么东西,噢,一个指针指向数组,不就是指针又像数组了。破案了。
我们现在来写这样变量的类型(都假设是int),首先,他是一个指针,一级指针怎么写int *a
就是了,一个数组怎么写 int a【10】嘛。假如你是c语言元老级人物,你会怎么设计,还不是通俗易懂的行了,最简单的就是直接和一起,但是怎么和,我们想类型是不是不会变,但是名字变,那就以名字为核来和(你问我为什么以名字来和,我又不是元老,又不是我说了算),看这个好像可以和,指针好和,他的名字就一边,那数组怎么和左边有,右边也有,但是int是不是在指针变量出现了,嘿嘿,刚好int不要就可以了变为int*a【10】,啊这个a是和哪个先结合,我们就去看结合顺序表,发现先和【10】结合,那不就变为数组了,那就加()啊,int (*a)【10】就可以了。这个就是类型了。额,是一个指针,指向了一个数组每个元素是int。
噢 int (*a)【10】一个一个理解,就是这是一个指针,指向了一个数组,而这个数组的每一个元素是int。按这个我们就可以写了:我们要一个指向数组的指针,而数组有20个元素每一个元素的类型是就是char(*a)【10】,现在我们来一个难的:我们要一个指向数组的指针,但是数组的每一个元素是指针数组。这个你们可以先看看,后面我会专门出一章讲这种。
我们刚才类型名称推到了怎么写类型,我们来反推,如果a先和【10】结合了,就变为数组了,
那int*a【10】是什么,你想a【10】用了还有什么没有,是不是int * ,这个是什么不就是指针类型吗,肯定是数组,又像指针,你按上面的方法叫一个名字。对,指针数组,指针数组,就是一个数组,数组有多个元素,每个元素是int。
这两个可能有点混乱,但是记住名字有两边有*,【】【】的优先级的更高的,因此,名字会先和【】结合,这个就是一个数组,类型名字后面的二个子就是数组,如果有括号的话(*a)这个就是指针,类型名字后面的二个子就是指针。现在理解了没,理解了也没关系,后面出一个类型都认识,但是还是不知道的题,哈哈哈,这样懂了和没懂就是一样都算没懂了。
函数指针变量
是不是有人就啊……了,函数还有指针
我们先看
我们可以看到一个函数还是有地址的,而且函数名称就是&函数名。所以函数还是有指针的,那函数有地址,我们要用的话,是不是就要用一个变量来储存,那这个变量怎么写呢。
我们看函数有上面特征int add (int l ,int j)噢,有一个int,然后一个函数名,后面还有二个变量,额……中两个变量就是函数要传的参数,
那么我们怎么用函数指针变量表示呢,我们表示的话,特征一定要有,
int (*padd)(int,int)是不是特征都有,我们自己名一个名,在写一个*表示是一个指针就行了。这个就是函数指针,而这个函数怎么用呢,
就是这样用。有人就无语了。你这个不是脱裤子放屁吗,我在h那直接用add不就行了吗,非要这样多此一举。对,如果我来我也会这样用,但是是在这个情况下。后面我们在说另一种情况,
我们先插播一个小广告。
嘿嘿,没接到。我们先插播一个小知识,叫做函数指针数组,对就是这个,名字都很长。看着我也烦,但是他还是有用的要学。按上面是套路,这是一个数组,每一个元素是函数指针。对不对,不理解,再看看前面的。现在我们就可以看另一种情况了。假如我们要实现一个计算器,我们是不是先分装四个函数,+,-,*,/。在分别实现,这个太简单了,我就不写了,如果我们没有学函数指针数组的时候是不是就这样写是不是很长,电脑读的不累,我们自己读的累啊。
但是我们学了函数指针数组就可以把这个简化了
是不是特别好,虽然没有减多少,但是还是减少了吧,现在我们写的计算器,他的计算方法不多,但是假如我们后面加上,%,&,《,》,……加了个百八十个是不是就有很大的区别了吗。学知识就是这样就算没简单多少,我们还是要自我安慰,后面就可以减很多了。