1

我见过许多带有void返回类型的指针函数的程序。这背后的原因是什么?void指针函数的实际需要是什么?

void *print_message_function( void *ptr ){
    int *message,i,j;
    message = (int *) ptr;
    if(*message == 1){
        for(i=0;i<5;i++){ res1 += array[i];
        }
    }

    else if(*message == 2){
        for(i=5;i<10;i++){
            res2 += array[i];
        }
    }
}

如果可能,请给出一个真实的例子,说明何时使用void指针函数。

4

5 回答 5

3

您的“指针函数”术语令人困惑。在我看来,你的问题是

在所有返回指向某种类型的指针的函数中,似乎有很多函数返回指向 void 的指针。有什么理由吗?

如果这确实是您的问题,那么 - 是的,在 C 中, avoid *可以转换为AnyOtherType *无需强制转换。因此,诸如qsort之类的函数采用指向函数的指针(“回调”作为另一个海报提到的),可以用作“通用”函数。在对特定类型的值进行排序时,您传递自己的比较器函数,该函数在内部知道它实际上不是void *,而是YourOwnType *

于 2012-05-24T15:24:03.770 回答
2

函数指针可以有任何返回类型,它只是一个指向函数的指针,所以如果一个函数不打算做任何事情,它会返回 a void,函数指针也是如此。

函数指针最常见的用法是实现回调以提供异步机制。

我之前的一个回答,详细解释了这一点:

C/C++/C#中的回调函数

于 2012-05-24T14:57:34.177 回答
1

函数指针几乎可以有任何返回类型。考虑这个例子:

#include "stdafx.h"
#include <iostream>

using namespace std;

// this defines a type called MathOp that is a function pointer returning
// an int, that takes 2 int arguments
typedef int (*MathOp)(int, int);

enum MathOpType
{
    Add = 1,
    Subtract = 2
};

// some generic math operation to add two numbers
int AddOperation(int a, int b)
{
    return a+b;
}

// some generic math operation to subtract two numbers
int SubtractOperation(int a, int b)
{
    return a-b;
}

// function to return a math operation function pointer based on some argument
MathOp GetAMathOp(MathOpType opType)
{
    if (opType == MathOpType::Add)
        return &AddOperation;

    if (opType == MathOpType::Subtract)
        return &SubtractOperation;

    return NULL;
}


int _tmain(int argc, _TCHAR* argv[])
{
    // declare a variable with the type MathOp, which is a function pointer to
    // a function taking two int arguments, and returning an int.
    MathOp op = &AddOperation;
    std::cout << op(2, 3) << std::endl;

    // switch the operation we want to perform by calling our one op variable
    op = &SubtractOperation;
    std::cout << op(2, 3) << std::endl;

    // just an example of using a function that returns a function pointer
    std::cout << GetAMathOp(MathOpType::Subtract)(5, 1) << std::endl;

    std::getchar();

    return 0;
}

上面的程序打印出 5、-1,然后是 4。函数指针可以有任何返回类型,并且非常强大。

于 2012-05-24T15:30:50.723 回答
0

如何定义指针函数?如果您的意思是说“指向函数的指针”,那显然不是。相反,它返回一个 void 指针。使用 void 指针的好处是它本质上是通用的,可以转换为我们需求的指针。

于 2012-05-24T17:29:17.973 回答
0

函数指针不需要返回 void 类型。90% 的示例演示了具有 void 类型的函数指针;因为,将读者从指向函数的指针的焦点转移到更少的信息(希望更少的混乱)。

这个优秀的教程int清楚地展示了指向返回类型的函数的函数指针。

于 2012-05-24T15:01:39.450 回答