关于C语言的指针捏

一二级指针

当你学习C语言一段时间之后亦或者开始学习时,你就听说过指针这个名词,但可能并不了解他到底是什么,听我来给你解释。

你是否在使用函数时为无法改变你所传入的变量无法改变而烦恼,这时候只需要使用一下指针,你就可以做到函数内外变化都影响数据。

而一级指针的写法也很简单,只需要一颗 * 就行了

具体的写法是:原数据类型* 指针名 = &原数据名

比如 int a = 10; 那么他的一级指针写法就是 int* pa = &a;

这里的int是根据它所指向数据的类型决定的,并不能随心所欲的自己写,而 * 则是证明它是指针的重要标志,指针名就没什么要求,只要做到之后自己能认出来就行,然后再把它指向对象的地址传给他即可,需要注意的是如果你不传,那么它将会指向未知的地方,称为野指针,如图所示

它所带来的最大问题就是不确定性,你把数据交给它,你不知道它指向何方,也不知道它所指向的空间是不是已经被使用进而篡改他的原数据,所以说当你定义指针但暂时又不知道指向时,给它赋上一个NULL,这样他虽然也没有指向也不能访问,但是至少是安全的。当你明确了指向后再去修改他。

而有了指向之后,你就可以实现一个很普遍的方法让函数内的数据出了函数之后不会无效,如图所示

这里之所以能在函数内改变函数外的值,最主要的就是因为指针所传递的是地址,如果不使用指针直接传递数据,它其实是在main函数内创建一份数据,然后在函数内又创建一份数据,虽然值一样,但是他们的地址不同,就像是一个和你一模一样的房子,但是他装修好并不代表你也装修好。

而指针不同,他们从值到地址都是一样的,所以修改之后里里外外都修改了,进而做到函数内修改出了函数也生效。

而一级指针也是有地址的,二级指针就是专门存放一级指针的指针,三级指针也是存放二级指针的指针,就这么套娃下去,不过超过二级的都很少用,仅需要了解即可。而二级指针的写法和一级指针大差不差  :一级指针类型 * 二级指针名 = 指向对象构成 和一级指针差不多 需要注意的点就是会有两个 * 因为二级指针本身自带一个 * 而一级指针的类型也带一个 *  所以有两个*

数组指针

那么我们继续深入,指针能存数组吗?答案是可以的,那么他到底是数组还是指针呢,又要怎么写呢。

首先他是指针,就和整型指针,字符指针一样,它是存放数组的指针。

? 好像和一级指针长得不太一样噢,怎么会这样捏,因为符号的运算优先级出来搞鬼了,

所以我们必须强迫*和parr先结合,让他先是一个指针,然后再是一个数组,数组有十个元素,每个元素的类型是int类型

此时你就可以使用它访问数组内容了,当然一般一个一级指针就能访问不需要用到数组指针

数组指针一般是用在二维数组上的

由于我拥有了这个二维数组首行的地址,我通过解引用得到首行首元素的地址每次+i代表跳过一个int大小,再次解引用就得到了他的值。

指针数组

这又是啥 ,这是数组,存放指针的数组,和上面的数组指针,存放数组的指针恰恰相反,他是一个数组,只不过里面存放的不是int char类型 而是指针。

这玩意就比上面的理解起来简单了,它是个数组吧,所以arr[5],那它类型是什么呢,看着是int类型,但是它存放的是指针啊,所以是int*, 普通的指针数组理解起来就这样简单,那还有不普通的吗,当然有,不过得让我现讲完函数指针再说。

函数指针

又再次深入,函数指针顾名思义存放函数的指针

倘若我有一个函数,而我想把它存放到一个指针里,那么我将会确定他是一个指针

所以先写个(*pt) 而它的返回类型是char* 我照搬就行 我还需要提供它的参数,这很重要,

(int,char*) 它指向的函数是谁呢,是test。再把他们结合起来就构成了:

char* (*pt) (int,char*)=test;此时的函数名test和数组名差不多加不加&都可以,因为名字即代表地址

这玩意乍一看好像没啥用啊,C语言有一个叫回调函数的东西,这个就是用在回调函数上的,听着是不是感觉很高大上,其实就那么回事

首先我创建出了+-*/四种运算,但是我不直接调用这些函数,我也不直接创建我需要计算的两个值

而是通过一个中间人函数 使用运算函数,而我的中间人函数的参数就是一个函数指针,他根据我main函数传入的参数,得到了运算函数的地址,OK接下来我们又根据提供的参数创建了两个临时变量,然后传到了运算函数的参数里,偶哟,我的main函数没调用运算函数但是又取得了我要的运算结果,这极大意义的保证了我运算函数的独立性,我只需要保证它的运算逻辑没问题就好了,不需要因为工作要求一直改来改去,一切变量的创建和使用我都是在中间人函数里使用的,只有最后万事俱备我才传到运算函数里让它算一下,这就是回调函数和函数指针的用处。

函数指针数组

这么啥都能缝到一起呢,这又是啥呢,这是存放函数指针的数组。

既然指针可以存放到数组,拿函数指针也是指针,自然也能放到数组,就构成了它函数指针数组。

不过也不是什么都能放这里边的,他还是得遵守最基本的数组的要求,相同类型的集合,这代表它所存放的函数指针返回类型和参数都要一样。

而写法

更诡异了有没有

好像这玩意就是要和普通指针写法不一样

咋看呢 首先char* (*)(int,char*)是他的数据类型,ptarr是他的名字,[5]代表他有五个成员。

没错 函数指针数组和函数指针就名字不一样,名字再改改再加上一个象征着数组的[]就大功告成了

是不是越后面越折磨捏。希望大伙看完能对指针有点更深入的理解 ,至少知道哦原来还有这种东西,希望我们能共同进步叭。

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值