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

関数ポインタは任意の戻り型を持つことができ、それは関数への単なるポインタであるため、関数が何も意図していない場合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型を返す必要はありません。例の90%は、void型の関数ポインターを示しています。なぜなら、関数へのポインターの焦点から読者の注意をそらすことは、情報が少なくなる(そしてうまくいけば混乱が少なくなる)からです。

この優れたチュートリアルは、型を返す関数への関数ポインターを明確に示していますint

于 2012-05-24T15:01:39.450 に答える
0

ポインタ関数をどのように定義しますか?「関数へのポインタ」と言うつもりなら、それは明らかにそうではありません。代わりに、voidポインタを返します。voidポインターを使用する利点は、それが本質的に一般的であり、要件のポインターに変換できることです。

于 2012-05-24T17:29:17.973 に答える