可以像这样创建函数指针数组:
typedef void(*FunctionPointer)();
FunctionPointer functionPointers[] = {/* Stuff here */};
Run Code Online (Sandbox Code Playgroud)
在不使用typedef?的情况下创建函数指针数组的语法是什么?
你好朋友,
我怎样才能使用函数指针数组?
如果我们将看到上面的链接,它会告诉我们函数指针是如何工作的.
现在的问题是我为什么要选择函数指针?
为什么我不能直接使用函数调用?
我会用函数指针获得什么好处?
例如
enum{a, b, c};
void A();
void B();
void C();
void (*fun[3])() = {A, B, C};
Now when I need to call a function I am doing like,
fun[a](); // This calls function A
// And so on...
Run Code Online (Sandbox Code Playgroud)
同样可以在函数调用中完成
就像我需要直接调用函数A,B或C.我可以这样
A();
B();
or
C();
Run Code Online (Sandbox Code Playgroud)
那为什么function pointer呢?
我正在尝试在 2 个计算机“玩家”之间构建一个高效的石头剪刀布模拟器。我在这里看到的一个建议是使用矩阵来存储可能的结果。我真的很喜欢这个想法,因为这意味着我不必有 9 个不同的 if() 语句来说明所有可能的值。每当比赛结束时,我都有函数来迭代每个玩家的获胜、失败和平局的数量。因此,我认为如果我可以构建一个函数指针的二维数组,那么 [0][0] 表示双方都抛出“Rock”并导致 Draw,抛出函数 addDraw( ) 每个玩家。我找到了一个在这里工作的一维函数指针数组的例子。
当我尝试编译时,我的代码抛出了几个错误。让我知道是否需要其他任何东西。
调用结果的函数:
void Player::result(vector<Player*> &vals, int x, int y)
{
Player *p1 = vals[0];
Player *p2 = vals[1];
void(*results1[3][3]) =
{
{ p1->addDraws, p1->addWins, p1->addLosses },
{ p1->addLosses, p1->addDraws, p1->addWins },
{ p1->addWins, p1->addLosses, p1->addDraws }
};
}
Run Code Online (Sandbox Code Playgroud)
添加赢、输和平局的函数:
void Player::addWins()
{
wins++;
}
void Player::addLosses()
{
losses++;
}
void Player::addDraws()
{
draws++;
}
Run Code Online (Sandbox Code Playgroud)
所有函数都在 Player.h 中初始化并在 Player.cpp 中声明(我认为这是正确的术语)。我收到的最常见的错误是“错误 C2440:‘初始化’:无法从‘void (__thiscall Player::*)(void)’转换为‘void *’
我正在尝试学习c,所以我尝试阅读一些源代码.
但我不知道这可能意味着什么:
static const char*(*const functab[])(void)={
ram,date
};
Run Code Online (Sandbox Code Playgroud)
第一部分,static const char*很好,因为它似乎是一个函数(有一个类型的参数void),static应该意味着它只在这个文件中可见,并且const char*应该意味着值不能改变,但地址可以改变.
但在这种情况下,在函数名后面的最后一部分之后没有意义,就像它的情况一样
static const char * date(void);
static const char * ram(void);
Run Code Online (Sandbox Code Playgroud)
而不是函数名称(*const functab[]),一个名为functab的const数组包含地址?
这是包含函数ram和date的某种包装函数吗?一些声明数组的替代方法?
首先我要说的是我知道函数指针是如何工作的。如果您想更详细地解释它们,请继续,但是我问您的是如何使用 C 在调度表中实现它们。
我已经搜索过调度表是什么,但除了对它如何工作的模糊理解之外,我并没有真正理解任何东西。
请分享它的实际用途以及我如何用 C 创建我自己的调度表。非常感谢帮助。
我在C++程序中有一个奇怪的typedef语句,由Py ++生成.
double radius(int); // function to be wrapped
typedef double (*radius_function_type)(int);
bp::def("radius", radius_function_type(&radius)); // bp::def is a function for wrapping
Run Code Online (Sandbox Code Playgroud)
到目前为止我想到的是上面的typedef statemnt不是那种类型,我们大多数人都熟悉,
typedef complex_type simple_alias;
Run Code Online (Sandbox Code Playgroud)
相反,它是一种声明指向函数的指针的方法,该函数将int作为参数并返回double(与原型相同).所以现在我的问题是,如何使用函数的地址作为参数来调用指向函数的指针(没有解除引用)?这也与原型不符.有人请解释一下!
我知道在 C 中,当涉及到指针参数时,我们有两种不同类型的语法。我只是想知道它们是否真的一样。考虑这个小程序,其中我有两个函数 fx1 和 fx2,它们采用具有不同 sintax 的指针参数:
void fx1( int* p ){
*p = 10;
}
void fx2( int p[] ){
*p = 10;
}
int main(){
int a = 20;
fx1(&a);
fx2(&a);
Run Code Online (Sandbox Code Playgroud)