Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何拥有返回int指针的函数数组_C_Arrays_Xcode_Function_Pointers - Fatal编程技术网

C 如何拥有返回int指针的函数数组

C 如何拥有返回int指针的函数数组,c,arrays,xcode,function,pointers,C,Arrays,Xcode,Function,Pointers,当我试图编译以下代码行时 int* x[](), (*y)(); 我得到了错误“x声明为int()类型的函数数组”您不能真正声明函数数组,但是您可以拥有一个函数指针数组,这可能会给您带来相同的效果,因为您可以在不显式取消引用的情况下调用它们 下面将声明一个5函数指针数组,返回int* int* (*x[5])(); 该网站将让你玩各种指针声明,看看它们在英语中的意思 这里是阅读C声明的黄金法则,从这里偷来的 从变量名开始(如果没有标识符,则从最里面的构造开始) 现在。看右边,不要跳过右边的括

当我试图编译以下代码行时

int* x[](), (*y)();

我得到了错误“x声明为int()类型的函数数组”

您不能真正声明函数数组,但是您可以拥有一个函数指针数组,这可能会给您带来相同的效果,因为您可以在不显式取消引用的情况下调用它们

下面将声明一个
5
函数指针数组,返回
int*

int* (*x[5])();
该网站将让你玩各种指针声明,看看它们在英语中的意思

这里是阅读C声明的黄金法则,从这里偷来的

从变量名开始(如果没有标识符,则从最里面的构造开始) 现在。看右边,不要跳过右边的括号;说什么 你看,再向左看,不要跳过括号,说什么 你看,如果有的话,跳出一层括号。向右看,说什么 你看。向左看;说出你所看到的。继续这样做直到 您可以说是变量类型或返回类型

当适用于上述声明时,我们说:

  • x是一个由5个指针组成的数组,指向返回int指针的函数
正如SteveCox在下面正确评论的那样,我们注意到,如果在遵循上述规则时在左侧遇到类型限定符,它将在其左侧而不是右侧描述该类型。例如,下面的声明声明了一个由5个指针组成的数组,指向返回常量指针到int,而不是poi的函数INTER到const int

int* const (*x[5])();

您不能真正声明一个函数数组,但是可以拥有一个函数指针数组,这可能会给您带来相同的效果,因为您可以在不显式取消引用的情况下调用它们

下面将声明一个
5
函数指针数组,返回
int*

int* (*x[5])();
该网站将让你玩各种指针声明,看看它们在英语中的意思

这里是阅读C声明的黄金法则,从这里偷来的

从变量名开始(如果没有标识符,则从最里面的构造开始) 现在。看右边,不要跳过右边的括号;说什么 你看,再向左看,不要跳过括号,说什么 你看,如果有的话,跳出一层括号。向右看,说什么 你看。向左看;说出你所看到的。继续这样做直到 您可以说是变量类型或返回类型

当适用于上述声明时,我们说:

  • x是一个由5个指针组成的数组,指向返回int指针的函数
正如SteveCox在下面正确评论的那样,我们注意到,如果在遵循上述规则时在左侧遇到类型限定符,它将在其左侧而不是右侧描述该类型。例如,下面的声明声明了一个由5个指针组成的数组,指向返回常量指针到int,而不是poi的函数INTER到const int

int* const (*x[5])();

对于包含2个函数指针的数组,请尝试此操作

#include <stdio.h>
int *first(void) { return NULL; }
int *second(void) { return NULL; }
int main(void) {
    int *(*fx[2])(void);
    fx[0] = first;
    fx[1] = second;
    /* ... */
    if (fx[0]() == fx[1]()) {
        printf("Calling both functions returns the same value.\n");
    }
    return 0;
}
#包括
int*first(void){return NULL;}
int*second(void){returnnull;}
内部主(空){
int*(*fx[2])(无效);
fx[0]=第一;
fx[1]=秒;
/* ... */
如果(fx[0]()==fx[1]()){
printf(“调用两个函数返回相同的值。\n”);
}
返回0;
}

对于包含2个函数指针的数组,请尝试此操作

#include <stdio.h>
int *first(void) { return NULL; }
int *second(void) { return NULL; }
int main(void) {
    int *(*fx[2])(void);
    fx[0] = first;
    fx[1] = second;
    /* ... */
    if (fx[0]() == fx[1]()) {
        printf("Calling both functions returns the same value.\n");
    }
    return 0;
}
#包括
int*first(void){return NULL;}
int*second(void){returnnull;}
内部主(空){
int*(*fx[2])(无效);
fx[0]=第一;
fx[1]=秒;
/* ... */
如果(fx[0]()==fx[1]()){
printf(“调用两个函数返回相同的值。\n”);
}
返回0;
}

实际应用程序可能如下所示:

#include <ansi_c.h>

int add_(int, int);
int sub_(int, int);
int mul_(int, int);
int div_(int, int);

enum    {
    ADD,
    SUB,
    MUL,
    DIV
};

int (*mathOps[4])(int, int);

int main(void)
{
    int i;
    mathOps[ADD]=add_;
    mathOps[SUB]=sub_;
    mathOps[MUL]=mul_;
    mathOps[DIV]=div_;

    for(i=ADD;i<=DIV;i++)
    {
        printf("results are: %d\n", mathOps[i](3, 3));  
    }

    getchar();
    return 0;   
}

int add_(int a, int b)
{
    return a + b;   
}
int sub_(int a, int b)
{
    return a - b;   
}
int mul_(int a, int b)
{
    return a * b;   
}
int div_(int a, int b)
{
    return a / b;   
}
#包括
int-add(int,int);
int sub_(int,int);
int mul_(int,int);
int div_u2;(int,int);
枚举{
添加
附属的,
穆尔,
DIV
};
int(*mathOps[4])(int,int);
内部主(空)
{
int i;
mathOps[ADD]=ADD;
mathOps[SUB]=SUB_u2;;
mathOps[MUL]=MUL;
mathOps[DIV]=DIV_2;;

对于(i=ADD;i,实际应用程序可能如下所示:

#include <ansi_c.h>

int add_(int, int);
int sub_(int, int);
int mul_(int, int);
int div_(int, int);

enum    {
    ADD,
    SUB,
    MUL,
    DIV
};

int (*mathOps[4])(int, int);

int main(void)
{
    int i;
    mathOps[ADD]=add_;
    mathOps[SUB]=sub_;
    mathOps[MUL]=mul_;
    mathOps[DIV]=div_;

    for(i=ADD;i<=DIV;i++)
    {
        printf("results are: %d\n", mathOps[i](3, 3));  
    }

    getchar();
    return 0;   
}

int add_(int a, int b)
{
    return a + b;   
}
int sub_(int a, int b)
{
    return a - b;   
}
int mul_(int a, int b)
{
    return a * b;   
}
int div_(int a, int b)
{
    return a / b;   
}
#包括
int-add(int,int);
int sub_(int,int);
int mul_(int,int);
int div_u2;(int,int);
枚举{
添加
附属的,
穆尔,
DIV
};
int(*mathOps[4])(int,int);
内部主(空)
{
int i;
mathOps[ADD]=ADD;
mathOps[SUB]=SUB_u2;;
mathOps[MUL]=MUL;
mathOps[DIV]=DIV_2;;

for(i=ADD;iI)我想你想要一个函数指针数组?是的,对不起。你知道错误是从哪里来的吗?我想你想要一个函数指针数组吗?是的,对不起。你知道错误是从哪里来的吗+1 for。但是最好在没有帮助的情况下学习如何阅读声明。@pmg我希望你的意思是“最好学会阅读”{在没有帮助的情况下阅读声明}”并不是说“最好在没有帮助的情况下学习}阅读声明”@pmg,我添加了一个带有链接的黄金法则。@merlin2011在最后一次编辑中,您忽略了一个事实,即类型限定符(const、volatile、restrict)可能会落在它们描述的东西的错误一侧。这就是我的意思,@SteveCox:)+1。但是最好学会如何在没有帮助的情况下阅读声明。@pmg我希望你的意思是“最好学会{在没有帮助的情况下阅读声明}”,而不是“最好{在没有帮助的情况下学习}阅读声明”@pmg,我添加了带有链接的黄金规则。@merlin2011在最后一次编辑中,你忽略了类型限定符的事实(const、volatile、restrict)可能落在他们描述的东西的错误的一边。这就是我的意思,@SteveCox:)