指向函数Prototype的指针

时间:2018-04-26 21:38:02

标签: c arrays pointers casting

我想弄清楚那些原型是什么意思

1.int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *), 
                 int (*fpCalculation[3]) (const char *));

2.int* (*fpData[2])(int (*paIndex)[3] , int (* fpMsg) (const char *), 
                     int (* fpCalculation[3]) (const char *));

3.int* (*(*fpData)(const char *))(int (*paIndex)[3] , 
                                 int (* fpMsg) (const char *), 
                                 int (* fpCalculation[3]) (const char *));

4 个答案:

答案 0 :(得分:3)

首先,您应该找到正在声明的实际变量。在所有3个示例中,这是fpData。然后你应该开始阅读这个从内到外的变量的声明。

所以,让我们从第一个例子开始。我们看到fpData,所以我们说" fpData是...",然后我们看到" *"在" fpData"之前,我们说" fpData指向...",然后我们看到*fpData之外的函数类型声明,所以我们说" fpData是指向函数的指针......"。然后我们应该读取参数的类型和这个函数的结果。

好吧,你可以毫无问题地阅读所有3个参数的类型。他们是:

  • " paIndex指向整数为3的整数"
  • 的数组
  • " fpMsg指向函数从const char *到int"
  • " fpCalculation是从const char *到int"
  • 的函数指针长度为3的数组

在最后一个论点中,您应该注意[3]的优先级高于" *"。我的意思是,当从内到外读取声明时,你应该读取第一个数组然后指针。 I. e。 int *a[3]是" a是一个长度为3的指针int"而不是"指向数组的指针"。

假设所有这些我认为你可以毫无问题地阅读第二次声明。

现在你应该学习这个:函数结果的类型写在外面(即之前和之后)其他所有内容。

让我们考虑一下:

char (*(*fp)(int))(double)

这意味着什么?好吧,让我们开始阅读," fp是指向函数的指针,它接受int并返回......什么?"好吧,我们已经阅读了(*fp)(int)部分。现在我们想要阅读其他所有内容。我们想要了解我们已经读过的函数的结果类型是什么。现在我们应该注意到函数的结果是在其他所有东西之外写的东西(即,之前和之后),i。即在我们已经读过的内容之外。

所以,我们已阅读(*fp)(int)。其他的,我。即char (*XXX)(double)是我们已经读过的函数的返回类型。所以,好吧,让我们继续阅读。最后我们会得到这个:

" fp是指向函数的指针,该函数获取int并返回指向函数的指针,该函数获取double并返回char"。

现在你可以毫无问题地阅读第三个声明了

答案 1 :(得分:1)

chux发布的 C乱码↔英语链接看起来仍然像胡言乱语 我。所以我试着听起来更人性化了:

int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *), 
                 int (*fpCalculation[3]) (const char *));

这声明了一个函数指针fpData,它返回一个指向int的指针。该 function接受以下类型的3个变量:

  1. paIndex是指向维度为3的int数组的指针。这可用于 例如,你有这个:

    void bar(int (*paIndex)[3])
    {
    }
    
    void foo(void)
    {
        int fields[5][3] = { {1,1,1}, ... };
    
        bar(fields);
    
    }
    
  2. fpMsg是一个返回int的函数指针。该功能需要一个 仅参数,const char*(基本上是一个字符串)。

  3. fpCalculation是返回的函数指针的维数3的数组 int。这些函数仅用于参数:const char*

  4. 这是一个函数指针的野兽,它在这样的环境中工作:

    #include <stdio.h>
    
    int msg(const char *name)
    {
        printf("msg: %s\n", name);
        return 0;
    }
    
    int abc1(const char *name)
    {
        printf("abc1: %s\n", name);
        return 0;
    }
    
    int abc2(const char *name)
    {
        printf("abc2: %s\n", name);
        return 0;
    }
    
    int *scary_function(int (*paIndex)[3] , int (* fpMsg) (const char *), 
                         int (*fpCalculation[3]) (const char *))
    {
    
        fpMsg("fpMsg");
        fpCalculation[0]("fpCalculation0");
        fpCalculation[1]("fpCalculation1");
        fpCalculation[2]("fpCalculation2");
    
        for(int i = 0; i < 4; ++i)
        {
            for(int j = 0; j < 3; ++j)
            {
                printf("%-3d ", paIndex[i][j]);
            }
            puts("");
        }
    
        return NULL;
    }
    
    void foo(void)
    {
        int matrix[4][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} };
    
        int (*fpcalcs[3])(const char*) = { msg, abc1, abc2 };
    
        int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *), 
                         int (*fpCalculation[3]) (const char *));
    
    
        fpData = scary_function;
    
        // calling the function through the function pointer
    
        fpData(matrix, msg, fpcalcs);
    }
    
    int main(void)
    {
        foo();
        return 0;
    }
    

    这是

    的输出
    msg: fpMsg
    msg: fpCalculation0
    abc1: fpCalculation1
    abc2: fpCalculation2
    1   2   3   
    4   5   6   
    7   8   9   
    10  11  12  
    

    所以我详细解释了如何解析这些函数的声明 指针。现在尝试自己了解其他2,如果你还有问题, 发表评论。

答案 2 :(得分:1)

1.int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *), int (*fpCalculation[3]) (const char *));

这里,fpdata 是指向一个函数的指针,该函数接受三个参数并返回一个指向整数的指针。参数如下:

  1. 指向 3 个元素的整数数组的指针,
  2. 指向以 const char 指针作为参数并返回类型为 int 的函数的指针,
  3. 3 个函数指针数组,每个函数以 const char 指针作为参数,返回类型为 int

2.int* (*fpData[2])(int (*paIndex)[3] , int (* fpMsg) (const char *), int (* fpCalculation[3]) (const char *));

在这种情况下,fpdata 是 2 个函数指针的数组,每个函数接受三个参数 -

  1. 指向 3 个元素的整数数组的指针,
  2. 指向以 const char 指针作为参数并返回类型为 int 的函数的指针,
  3. 3 个函数指针数组,每个函数以 const char 指针作为参数,返回类型为 int

返回类型是一个整数指针

3.int* (*(*fpData)(const char *))(int (*paIndex)[3] , int (* fpMsg) (const char *), int (* fpCalculation[3]) (const char *));

最后,fpdata 是一个指向带有三个参数的函数的指针 -

  1. 指向 3 个元素的整数数组的指针,
  2. 指向以 const char 指针作为参数并返回类型为 int 的函数的指针,
  3. 3 个函数指针数组,每个函数以 const char 指针作为参数,返回类型为 int

返回类型是一个以const char指针为参数的函数指针,返回类型是一个整数指针。

答案 3 :(得分:0)

int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *), 
                 int (*fpCalculation[3]) (const char *));

它是函数原型声明。

fpData是一个函数名,该函数带有三个参数:

  1. int (*paIndex)[3]
  2. int (* fpMsg) (const char *)
  3. int (*fpCalculation[3]) (const char *)

…并返回函数指针[指向不带参数但返回整数的函数的指针]。

详细信息::给定功能可以编写如下

typedef  int* (*ret_func_ptr) ();

ret_func_ptr (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *), 
                 int (*fpCalculation[3]) (const char *));