理解数组指针,指针数组,函数指针,函数指针数组,指向指针数组的指针

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)。

             所以大家都能明白了吧,好了到此结束了,有什么问题可以留言哦!






   



猜你喜欢

转载自blog.csdn.net/congjichukaishi/article/details/80397663