为什么指针函数总是有void返回类型?

时间:2012-05-24 14:55:45

标签: c

我见过许多具有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指针功能。

5 个答案:

答案 0 :(得分:3)

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

  

在所有返回指向某种类型的指针的函数中,看起来如此   其中很多是返回指向void的指针的函数。   有什么理由吗?

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

答案 1 :(得分:2)

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

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

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

<强> Callback functions in C/C++/C#

答案 2 :(得分: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.函数指针可以有任何返回类型,并且非常强大。

答案 3 :(得分:0)

不需要函数指针返回void类型。 90%的例子演示了带有void类型的函数指针;因为,更少的信息(并且希望不那么混乱)会分散读者对指向功能的指针的注意力。

This excellent tutorial清楚地演示了返回int类型的函数的函数指针。

答案 4 :(得分:0)

如何定义指针功能?如果你的意思是说“指向函数的指针”,那显然不是这样。相反,它返回一个void指针。使用void指针的优点是它本质上是通用的,可以转换为我们要求的指针。