指针与数组,指针与函数之间的关系

指针数组和数组指针

指针数组,它的关键在于是一个数组,即数组中每个元素都是指针。
数组指针,他的关键在于是指针变量,即这个指针指向一个数组。

#include<stdio.h>
int main ()
{
    int arr [4] = {0};//这是一个数组,大家都知道。
    int *parr1[4];//这是指针数组,首先[]的优先级比*的优先级高,所以parr
                 //先与[]结合,它是一个数组,然后再与*结合,即数组中的
                 //每个元素都是指针。
    int (*parr2)[4];//这是数组指针,因为()的优先级比[]的高
                    //所以parr是一个指针变量,然后与[]结合
                    //所以,这是数组指针。              
    int *(*parr3)[4];//较为复杂一点的数组指针,首先parr3是一个指针变量,
                     //然后与[]结合,变为数组指针,而前面又有*,所以它可以指
                     //向一个大小为3个元素的数组,每个元素是指针。   
}

函数指针

函数指针就是函数的指针,他是一个指针,指向一个函数。

#include <stdio.h>
#include <string.h>
char* fun (char *p1,char *p2)
{
    int tmp = 0;
    tmp = strcmp(p1,p2);
    if (tmp==0)
    {
        return p1;
    }
    else 
    {
        return p2;
    }

    }
int main ()
{
    char *(*pfun)(char *p1,char *p2);
    pfun = &fun;
    (*pfun)("aa","bb");
    return 0;}//这个例子就很好的解释了函数指针这个定义。我们清楚表达式
              //"char*(*pfun)(char*p)"定义的是一个函数指针pfun。
              //首先通过(*pfun)取出存在这个地址上的函数,然后调用。

函数指针的数组

函数指针的数组,它是一个数组,数组中的每个元素是一个函数指针,这个指针可以指向一个函数。

#include <stdio.h>
#include <string.h>
char *fun1(char*p)
{
    printf ("%s
",p);
    return p;
}
char *fun2 (char *p)
{
    printf ("%s
",p);
    return p;
}
char *fun3 (char*p)
{
    printf ("%s
",p);
    return p;
}
int main ()
{
    char *(*pfun[4])(char *p)//这里的表达式表示的就是函数指针的数组
    pfun[1] = fun1;//可以直接用函数名表示地址
    pfun[2] = &fun2;//也可以在函数名前加取地址符号。
    pfun[3] = &fun3;

}

函数指针数组的指针

它指的还是一个指针,只不过这个指针指向一个数组,这个数组里的元素是可以指向函数的指针,有点绕。

void (*(*pfun)[3])(char *)//首先pfun是一个指针变量,然后指向一个数组,这个
                         //数组有三个元素,这几个元素可以指向函数的指针,函数
                         //的参数是char *,返回值为 void

原文地址:https://www.cnblogs.com/chan0311/p/9427372.html