function pointer用法 - 你如何在C中傳遞一個函數作為參數?




typedef struct (5)

我想創建一個函數,該函數執行一組數據上通過參數傳遞的函數。 你如何在C中傳遞一個函數作為參數?


Answers

將函數的地址作為參數傳遞給另一個函數 ,如下所示

#include <stdio.h>

void print();
void execute(void());

int main()
{
    execute(print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void f()) // receive address of print
{
    f();
}

我們也可以使用函數指針傳遞函數作為參數

#include <stdio.h>

void print();
void execute(void (*f)());

int main()
{
    execute(&print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void (*f)()) // receive address of print
{
    f();
}

你需要傳遞一個函數指針 。 這個語法有點麻煩,但是一旦你熟悉它,它的確很強大。


從C ++ 11開始,您可以使用函數庫以簡潔通用的方式執行此操作。 語法是,例如,

std::function<bool (int)>

其中bool是第一個參數類型為int的單參數函數的返回類型。

我在下面列出了一個示例程序:

// g++ test.cpp --std=c++11
#include <functional>

double Combiner(double a, double b, std::function<double (double,double)> func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}

但有時使用模板函數會更方便:

// g++ test.cpp --std=c++11

template<class T>
double Combiner(double a, double b, T func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}

這個問題已經有了定義函數指針的答案,但是它們可能會變得非常混亂,特別是如果你要將它們傳遞給你的應用程序。 為了避免這種不愉快,我建議你將函數指針變成更可讀的類型。 例如。

typedef void (*functiontype)();

聲明一個返回void且不帶參數的函數。 要創建一個這種類型的函數指針,你現在可以這樣做:

void dosomething() { }

functiontype func = &dosomething;
func();

對於一個函數,返回一個int,並採取一個字符,你會做的

typedef int (*functiontype2)(char);

並使用它

int dosomethingwithchar(char a) { return 1; }

functiontype2 func2 = &dosomethingwithchar
int result = func2('a');

有些庫可以幫助將函數指針轉換為可讀的類型。 boost函數庫很棒,非常值得努力!

boost::function<int (char a)> functiontype2;

比上面好得多。


您無法直接在瀏覽器網址欄上輸入。

例如,您可以看到如何使用Live HTTP Headers在Internet上發送POST數據。 結果會是這樣的

http://127.0.0.1/pass.php
POST /pass.php HTTP/1.1

Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://127.0.0.1/pass.php
Cookie: passx=87e8af376bc9d9bfec2c7c0193e6af70; PHPSESSID=l9hk7mfh0ppqecg8gialak6gt5
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
username=zurfyx&pass=password

它說的地方

Content-Length: 30
    username=zurfyx&pass=password

將成為職位價值觀。





c function pointers syntax parameters