1.普通类型指针:
- 指针可以看成一把钥匙,然后用这把钥匙去开内存中小房子的数据,
- 既然我们把指针看成是钥匙都是来开内存中房子的钥匙,我们都知道同一个单元楼的钥匙样式都一样,只是齿形不同,那么指针也可以看成这样子,不管是什么类型的指针样式是一样的,即大小是一样的都是4个字节,但齿形不同,即这4个字节里面放的数据不同,
指针的自增和自减,
我们发现都是以类型的字节数在进行加减的,其实不管什么类型都是这样的,指针可以相减但是不可以相加。如果相加那么指针就会跑飞了,不知道指在什么位置了,其实这都是别人编写编译器设定好的规则,相减可以得出两个指针之间有几个这种类型的数据。回到原点,指针的作用是什么,其实归根到底,指针也是内存的一部分,只不过编译器在编译的时候,让指针这种类型有一些特殊的功能,这些特殊功能是可以通过指针去操作内存,如果我们把变量名看成内存的别名,就很好理解了,操作内存的好处有以下几点:
- 我们都知道函数返回值只有一个,如果我们相返回多个值,就可以用到指针,把变量的地址直接传到函数里面去,直接修改地址里面的数据,就可以达到返回几个值的作用。
- 可以用指针来操作堆内存,实现动态规划
- 还有一个就是,我觉得C没有了指针,我不知道怎么写代码了,
- 指针常规操作:*解引用,这个符号的作用就是来开门的,&取地址,把自己的地址暴露出来,等别人来用,
- 指针的约束:
const int *p :const修饰的int 说明是数据的值不能修改,就是不能通过指针修改数据的值,但是指针可以改变指向
int const *p :这个和上面的一样
int * const p:const修饰指针,指针不能改变指向,但是可以改变指向数据的值
const int * const p :既不可以改变指向也不可以该值
2.特殊类型指针:
- 二级指针:**p,这是一个指向指针的指针,就是说,我们可以用这个东西来找指针,最贴近的实例的就是二维数组,行名就是二级指针,列就是一级指针,
- 指针数组:int *p[n];本质是数组,因为【】优先级别高,p先与【】结合,只不过数组里面全是指针类型,最贴近的实例还是二维数组,所以的行就是一个指针数组,用来保存每行的首地址。
- 数组指针:int (* p)[n];本质是指针,()的优先级别高,p先与 * 结合。就是一个指向个数为n的数组的指针,与二级指针很像。
- 指针函数:本质是函数,返回值是指针。写法
int* fun();
- 函数指针:本质是指针,是一个指向函数的指针,限制就是在同样参数的函数,
下面我们就来演示几个函数指针的使用方法。
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);//返回函数
这是我学习的一些小心得,希望看到的人能有所收获,其实如果指针掌握好了,写起程序来真的是得心应手,特别是在写链表,栈这些的时候,我是通过学习了单片机原理,才逐渐加深对指针的理解,在学习单片机的时候,我了解到了内存的分配,函数的调用,以及粗浅的指针实现(寻址)。适当的学习一些底层实现,真的会加深你们对编程的理解。