目录
实例:int (*add)(int a,int b) =add ;(add代表加法函数,函数名就是函数的地址)
函数指针 有什么用呢,函数指针能简化很多代码量,让程序变得更加健壮,你可以思考,用一个函数指针模板只要返回值和参数相同就可以适应功能不同的函数,大量减少重复代码。
一,指针的基础理解
在电脑中所有的数据都会被存储,我们大多数时候只需要一部分数据,那我们如何准确找到那些数据呢,这个时候就需要一些编号来找到数据,像我们身份证上的编号一样,在计算机中每个字节都有自己的编号,而指针是用来存储这些地址编号的。
二,指针的基本使用
一级指针的结构是:(类型 ) + (* )+(名称),例如:int * pa;这个就是一个int 类型的一级指针,对其解引用可以获得指针指向空间里面的内容,二级指针则是存储一级指针的地址,例如:int * *paa =&pa;对其解引用一次可以获得一级指针的指向的内容,在解引用一次可以获得一级指针指向的内容,以此类推可以理解三级,四级指针。
三,为什么要用指针
首先指针最广泛的用法是在函数传参的时候,众所周知,一遍数据类型在传参数时,大部分是拷贝,函数中的改变无法影响其他函数中的实参,而因为指针和其他的不一样,指针是直至本质(地址),只要将实参的地址传过去,通过形参的指针找到地址进行,操作可以避免因为拷贝导致的无法改变问题。其次,指针能对数据进行更加精准的操作,能够进行通过强制转化进行字节上的操作。指针也能简化大量的代码量,这些优点在我们日后进行使用时感觉到的。还有很多优点我就不一一列举了,大家有兴趣可以网上找资料。
四,指针与数组的联系
数组和指针的联系可谓是千丝万缕,数组的实质就是指针,数组的名称就是第一个元素的地址,指针也能用 [ ] 这种数组的形式表示,数组也能用指针 *(arr+i)的形式表示。接下来我展示一些数组和指针的转化和对应关系
int *arr = int arr[ ]
int (*p)[ ] = int arr[ ] [ ]
五,指针的拓展使用
1)指针数组
结构:int *p[ ]
指针数组的实质还是一个数组,它的用途可以用来存储指针,方便使用,例如
int *pa=NULL;
int *pb=NULL;
int *pc=NULL;
int *arr[]={pa,pb,pc};
2)数组指针
结构:int (*p)[ ]
数组指针的本质则是一个指针,看起来结构和指针数组相同,但是不要忘记【 】和 * 优先级不同,数组指针的 p 是先与【】结合的,而指针数组是先与 * 结合的。指针数组可以存储二维数组等多位数组的地址,并且很方便的拿出,例如:
3)函数指针·
结构:返回类型 (*p) (参数 1,参数 2);
实例:int (*add)(int a,int b) =add ;(add代表加法函数,函数名就是函数的地址)
函数指针 有什么用呢,函数指针能简化很多代码量,让程序变得更加健壮,你可以思考,用一个函数指针模板只要返回值和参数相同就可以适应功能不同的函数,大量减少重复代码。
六,sizeof 和stelen 的补充
说先要认识到sizeof 和 strlen 的差别,sizeof 是只看()里面的类型,不会进入内存计算,如 int,数组则是 int [ 10]。而 strlen 则是进入给的地址内存,找到"\0",如何统计字节数。
如果sizeof()里面的是指针,则结果是4||8,因为编译环境不同,指针大小不同,而strlen 里面只能放地址,别人可能会非法访问