我在C中编写一个使用函数指针数组的程序。如果我不包含参数,我可以使用我的代码调用函数而不会出现问题。
int (*functionsArray[2][3])() = {
{functionOne,functionTwo,functionThree},
{functionFour,functionFive,functionSix}
};
然而,当我尝试传递参数int x
:
int (*functionsArray[2][3])(int x) = {
{functionOne,functionTwo,functionThree},
{functionFour,functionFive,functionSix}
};
我收到错误:
invalid conversion from 'int (*)()' to 'int (*)(int)'
这些函数也没有返回int,我不能将它们声明为void吗?
void(*functionsArray[2][3])(int x) = {
{functionOne,functionTwo,functionThree},
{functionFour,functionFive,functionSix}
};
尝试此操作会导致错误:
error: invalid conversion from 'int (*)()' to 'void (*)(int)'
感谢。
答案 0 :(得分:1)
这样可以正常工作,提供你正确地声明了这些功能:
#include <stdio.h>
int functionOne(int x) { return 1; }
int functionTwo(int x) { return 2; }
int functionThree(int x) { return 3; }
int functionFour(int x) { return 4; }
int functionFive(int x) { return 5; }
int functionSix(int x) { return 6; }
int (*functionsArray[2][3])(int x) = {
{functionOne, functionTwo, functionThree},
{functionFour, functionFive, functionSix}
};
int main (void) {
printf ("%d\n", (functionsArray[0][1])(99));
printf ("%d\n", (functionsArray[1][2])(99));
return 0;
}
该计划的输出为2
和6
。
如果您想要否返回值,它也会起作用:
#include <stdio.h>
void functionOne(int x) { puts ("1"); }
void functionTwo(int x) { puts ("2"); }
void functionThree(int x) { puts ("3"); }
void functionFour(int x) { puts ("4"); }
void functionFive(int x) { puts ("5"); }
void functionSix(int x) { puts ("6"); }
void (*functionsArray[2][3])(int x) = {
{functionOne, functionTwo, functionThree},
{functionFour, functionFive, functionSix}
};
int main (void) {
(functionsArray[0][1])(99);
(functionsArray[1][2])(99);
return 0;
}
该程序还按预期输出2
和6
。
这一切都归结为确保函数声明与数组中给出的类型匹配。
答案 1 :(得分:0)
声明数组时:
int (*functionsArray[2][3])(int x) =
{
{functionOne,functionTwo,functionThree},
{functionFour,functionFive,functionSix}
};
数组的每个元素都必须是int (*)(int)
类型。否则,编译器会正确报告错误。
举一个简单的案例:
void foo()
{
}
int (*fp)(int x) = foo;
应该导致相同的编译器错误,因为您尝试使用int (*)(int)
初始化foo
类型的变量,其类型为void (*)()
。