📜  C或C++中函数的地址(1)

📅  最后修改于: 2023-12-03 14:40:25.786000             🧑  作者: Mango

C/C++中函数的地址

在C和C++中,函数也是一种数据类型。每个函数在内存中都有一个地址,就像变量一样。这使得我们可以像处理变量一样处理函数。

获取函数的地址

要获取函数的地址,只需在函数名前加上取地址运算符&。例如:

#include <stdio.h>

void foo() {
    printf("Hello world!");
}

int main() {
    void (*ptr)() = &foo;   // 获取foo函数的地址
    (*ptr)();               // 使用指针调用foo函数
    return 0;
}

我们定义了一个指向函数的指针ptr,将它指向foo函数的地址。然后通过指针调用这个函数。

使用函数的地址

有了函数的地址,我们可以把它传递给其他函数或存储它以备将来使用。

#include <stdio.h>

void foo() {
    printf("Hello world!");
}

void bar(void (*f)()) {
    f();            // 调用f指向的函数
}

int main() {
    void (*ptr)() = &foo;
    bar(ptr);       // 传递函数指针给bar函数
    return 0;
}

我们定义了bar函数,接收一个指向函数的指针,然后调用该指针指向的函数。在main函数中,我们创建一个指向foo函数的指针,将它作为参数传递给bar函数。

使用typedef简化函数指针声明

由于函数指针的类型定义往往会非常复杂,为此,C/C++提供了typedef语句,方便声明复杂的函数指针类型。例如:

#include <stdio.h>

// 声明函数指针类型
typedef void (*func_ptr)();

void foo() {
    printf("Hello world!");
}

void bar(func_ptr f) {
    f();
}

int main() {
    func_ptr ptr = &foo;
    bar(ptr);
    return 0;
}

在声明函数指针类型时,我们使用typedef定义了一个新类型func_ptr,表示指向无返回值函数的指针类型。接着,我们使用这个类型作为bar函数的参数类型,使得bar函数更加可读且易于维护。