指针

1.普通类型指针:

  • 指针可以看成一把钥匙,然后用这把钥匙去开内存中小房子的数据,
  • 既然我们把指针看成是钥匙都是来开内存中房子的钥匙,我们都知道同一个单元楼的钥匙样式都一样,只是齿形不同,那么指针也可以看成这样子,不管是什么类型的指针样式是一样的,即大小是一样的都是4个字节,但齿形不同,即这4个字节里面放的数据不同,
    哈哈
  • 指针的自增和自减,
    这里写图片描述
    我们发现都是以类型的字节数在进行加减的,其实不管什么类型都是这样的,指针可以相减但是不可以相加。如果相加那么指针就会跑飞了,不知道指在什么位置了,其实这都是别人编写编译器设定好的规则,相减可以得出两个指针之间有几个这种类型的数据。

  • 回到原点,指针的作用是什么,其实归根到底,指针也是内存的一部分,只不过编译器在编译的时候,让指针这种类型有一些特殊的功能,这些特殊功能是可以通过指针去操作内存,如果我们把变量名看成内存的别名,就很好理解了,操作内存的好处有以下几点:

    • 我们都知道函数返回值只有一个,如果我们相返回多个值,就可以用到指针,把变量的地址直接传到函数里面去,直接修改地址里面的数据,就可以达到返回几个值的作用。
    • 可以用指针来操作堆内存,实现动态规划
    • 还有一个就是,我觉得C没有了指针,我不知道怎么写代码了,
  • 指针常规操作:*解引用,这个符号的作用就是来开门的,&取地址,把自己的地址暴露出来,等别人来用,
  • 指针的约束:
    const int *p :const修饰的int 说明是数据的值不能修改,就是不能通过指针修改数据的值,但是指针可以改变指向
    int const *p :这个和上面的一样
    int * const p:const修饰指针,指针不能改变指向,但是可以改变指向数据的值
    const int * const p :既不可以改变指向也不可以该值

2.特殊类型指针:

  1. 二级指针:**p,这是一个指向指针的指针,就是说,我们可以用这个东西来找指针,最贴近的实例的就是二维数组,行名就是二级指针,列就是一级指针,
  2. 指针数组:int *p[n];本质是数组,因为【】优先级别高,p先与【】结合,只不过数组里面全是指针类型,最贴近的实例还是二维数组,所以的行就是一个指针数组,用来保存每行的首地址。
  3. 数组指针:int (* p)[n];本质是指针,()的优先级别高,p先与 * 结合。就是一个指向个数为n的数组的指针,与二级指针很像。
  4. 指针函数:本质是函数,返回值是指针。写法int* fun();
  5. 函数指针:本质是指针,是一个指向函数的指针,限制就是在同样参数的函数,
    下面我们就来演示几个函数指针的使用方法。
    1.这是最本质的写法,具体可以用在什么位置呢,就看你怎么操作了,我说个最简单的例子就是传递函数参数的时候。
    int (*p)(int,int);
    int fun(int  a,int b);
    p=fun;//我们就可以用p来代替fun了
    int a,b;
    p(a,b);

2.

    int(*p) [5] (int,int);
    int fun1(int a,int b);
    int fun2(int a,int b);
    int fun3(int a,int b);
    int fun4(int a,int b);
    int fun5(int a,int b);
    p[0]=fun1;//我们可以用一个index来决定使用什么函数,就可以实现什么
    p[1]=fun2;//状态下实现什么函数,
    p[2]=fun3;
    p[3]=fun4;
    p[4]=fun5;

3.

typedef int (* PF)(int ,int);//这里的PF不是具体的指针,是类型名
PF f;
int fun(int a,int b);
f=fun;
int fun1(int a,PF f);//这就是传入函数参数
int fun2(int a,int(*f)(int,int));//也可以这样写
PF  fun3(int a,int b);//返回函数

这里写图片描述

这是我学习的一些小心得,希望看到的人能有所收获,其实如果指针掌握好了,写起程序来真的是得心应手,特别是在写链表,栈这些的时候,我是通过学习了单片机原理,才逐渐加深对指针的理解,在学习单片机的时候,我了解到了内存的分配,函数的调用,以及粗浅的指针实现(寻址)。适当的学习一些底层实现,真的会加深你们对编程的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值