访问函数指针数组

时间:2013-12-16 05:44:50

标签: c pointers

以下是函数指针数组

(int) (*a[5]) (int);
 int f1(int){};
 ...

以下定义方式是否正确?

a = f1;
a + 1 = f2;
a + 2 = f3; 
...

我们如何称呼这些功能?

*a(1) // is this correct???
*(a+1) (2)

5 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:2)

你所谓的“定义”只是赋值,当你这样做时,它是错误的,因为你不能分配给C中的数组。你只能分配给单个数组元素,正确的是{{1等等。

通常,对于函数指针数组,不需要在运行时动态分配它们。函数指针无论如何都是编译时间(或链接时间)常量。

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)

答案 2 :(得分:1)

你可以写:

a[0]=&f1;

并将其命名如下:

a[0](1);

请注意,在调用函数时不需要使用指针。 如果你坚持使用指针,那么无论如何你都可以做到:

(*a[0])(1);

答案 3 :(得分: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;
}

答案 4 :(得分: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;
}