访问函数指针数组

4
以下是函数指针数组。
(int) (*a[5]) (int);
 int f1(int){};
 ...

以下的定义方式正确吗?
a = f1;
a + 1 = f2;
a + 2 = f3; 
...

我们如何称呼这些函数?
*a(1) // is this correct???
*(a+1) (2)

3
你的编译器说了什么?我怀疑它抱怨期望一个“左值”而得到了一个“右值”? - Floris
这里提供了更多的澄清信息:https://dev59.com/uHVC5IYBdhLWcg3wjx_u - Dayal rai
5个回答

2
#include <stdio.h>

int f1(int i) { return i; }
int f2(int i) { return i; }

int main() {
    int (*a[5]) (int);
    a[0] = f1;
    a[1] = f2;
    printf("%d\n", a[0](2));
    printf("%d\n", a[1](5));
}

问题标记为C而不是C++。 - Jens Gustedt
1
在最后一个 } 之前,你需要加上 a return 0; /* Or something */ - Steve Barnes
1
最新的C语言(C99,C11)如果没有显式的返回语句,则默认返回0。 - Oleg Razgulyaev

2
你所谓的“定义”只是赋值,而你现在的做法是错误的,因为在C语言中你不能给数组赋值。你只能给数组的单个元素赋值,正确的方法是a[0] = f1等等。
通常对于函数指针数组,没有必要在运行时动态分配它们。函数指针在编译时(或链接时)已经是常量了。
/* in your .h file */
extern int (*const a[5]) (int);

/* in your .c file */
int (*const a[5]) (int) = { f1, f2, f3 };

为了简化使用函数指针的方法,标识符 f1 等同于函数指针 &f1,使用带括号的函数指针如 a[0](5) 与解除引用指针后调用结果函数相同 (*(a[0]))(5)。请保留所有的 HTML 标签。

我仍在努力理解a0如何等同于(*(a[0]))(5)。 - codey modey
@user2901020,对于任何函数指针 int (*fp)(int)fp(5)(*fp)(5) 是等价的。这里没有什么需要“理解”的,这只是 C 语言定义的一种快捷方式。 - Jens Gustedt

1

you can write:

a[0]=&f1;

and call it as below:

a[0](1);

请注意,在调用函数时无需使用指针。 如果您坚持使用指针,则可以按照以下方式操作:
(*a[0])(1);

1

最好使用typedef,所有函数都需要有共同的接口,并尽可能在声明时初始化。如果可能,函数数组也应该是const,作为一种安全措施。

#include <stdio.h>

typedef int (*mytype)();
int f1(int i) { return i; }
int f2(int i) { return i; }

int main() {
    const mytype a[5] = {f1,f1,f2,f2,f1};

    printf("%d\n", a[0](2));
    printf("%d\n", a[1](5));

    return 0;
}

0
#include<stdio.h> 
int (*a[5]) (int);
int f1(int i){printf("%d\n",i); return 0;}
int f2(int i){printf("%d\n",i); return 0;}
int f3(int i){printf("%d\n",i); return 0;}

int main(void)
{
    a[0] = f1;  // Assign the address of function
    a[1] = f2;
    a[2] = f3;

    (*a[0])(5);  // Calling the function
    (*a[1])(6);
    (*a[2])(7);

    getchar();
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接