1.什么是数组指针?
数组指针,其实是个指针,这个指针指向一个数组
举个栗子: int arr[3]={1,3,4};
int (*p) [3] =&arr
具体分析: arr是数组名,是数组首元素的地址,&arr是整个数组的地址,
由于()优先级高,所以(*p)是个指针,剩下的是指针所指向的内容,数组[3],数组包含的内容是3个
int 型元素;
如果你不明白数组指针到底有什么用,通过下面你就知道了。
如果main 函数中,要调用函数,需要传参:
如: int arr[][4] ={0};
查找二维数组中有没有一个数,search(arr) 我们传过去的是二维数组的首地址,也就是第一行的地址,
那我们在 void search ()函数的参数接受,就需要数组指针来接受,void search( int (*arr)[4])
它也等价于:void search (int arr[][4])。
2.什么是指针数组?
指针数组是个数组,数组里存放的是指针,也就是地址。
举个栗子:
char *arr[2] = {"hello ","world"}
这就是个指针数组,第一个元素存放的是hello的首地址,第二个是world的首地址。
3.什么是函数指针?
就是可以指向函数的指针,也可以说是存放函数地址的变量。
如: void (*fun)() ,这就是一个函数指针,
char *(p)(char *,const char *) = &my_strcpy
函数指针的重要性:
函数指针可以用传递函数的地址,它的可扩展性可以得到很好的体现。我们可以在一个函数里,
大的逻辑框架不需要动,把这个逻辑框架抽象出来,而把判断函数的标准变成一个函数指针,
也就是把一个单独的函数来判断是不是符合我们所需要的标准。
如果你还不理解,没关系, 具体例子:比如有个数组,要把它的奇数位放在偶数为前面,你会写一个函数 专门是把奇数位放到偶数位的前面:void ReorderOddEvon (int *pData,unsigned int length)
可是这个扩展性不好, 如果我们要求把负数放到正数的前面呢?所以,我们需要用到函数指针,
void Reorder (int *pData,unsigned int length,bool (*fun)(int) )
Reorder(pData,length , isEven);
isEven 这个函数是我们所要具体实现的需求 (把奇数位放到前面,把负数放到前面等) ,看到这儿你是不 明白了呢。
4.函数指针数组
就是存放函数指针的一个数组,跟我们前面讲的函数指针的用法基本类似,只不过我们传的是个数组罢了
void (*p[3]) (int) , p先和【3】结合,所以它是个数组,内容类型是 void (*)(int),其中参数为int 返回值为 void
5.指向函数指针数组的指针
举个具体例子也许你就明白了:
void (*(*p)[3]) (int) ,首先(*p)所以他是个指针,【3】,所以它指向一个数组,数组的元素都是
void (*) (int)。
所以大家都能明白了吧,好了到此结束了,有什么问题可以留言哦!