将函数指针指向函数的位置

where location to assign function pointer point to a function

我有一个指向 add_int 函数的 funtion_ptr 函数指针。

情况 1:当在 main 函数外放置一个语句 function_ptr = &add_int --> compiler error: error C2373: 'function_ptr' : redefinition; different type modifiers(这是在)

#include <stdio.h>

int add_int(int n, int m){
    return n + m;
}
int(*function_ptr)(int, int);
function_ptr = &add_int;  // it's here

void main(){
    int sum = (* function_ptr)(2, 3);
    printf("sum = %d", sum);
    _getch();
}

情况 2:main 函数中的 function_ptr = &add_int; --> 为真

#include <stdio.h>

int add_int(int n, int m){
    return n + m;
}
int(*function_ptr)(int, int);


void main(){
    function_ptr = &add_int;  // it's now here
    int sum = (* function_ptr)(2, 3);
    printf("sum = %d", sum);
    _getch();
}

任何人都可以为我解释这两种情况之间的区别。 谢谢!

function_ptr = &add_int; 是一个赋值语句。函数内部允许语句,但函数外部只允许声明。由于赋值不是声明,编译器会报错。

如果您想将指针作为其 declaration/definition 的一部分进行赋值,您可以将声明和赋值结合起来,如下所示:

#include <stdio.h>

int add_int(int n, int m){
    return n + m;
}
int(*function_ptr)(int, int) = &add_int;

int main(){
    int sum = (* function_ptr)(2, 3);
    printf("sum = %d", sum);
    return 0;
}

Demo.

您不需要在赋值语句中使用 &,函数的名称 (add_int) 就是它的地址...并且赋值语句应该在函数的范围内。

这是一个有效的例子:

#include <stdio.h>

int add_int(int n, int m);

int(*function_ptr)(int, int);


void main(){

    function_ptr = add_int;
    int sum = (* function_ptr)(2, 3);
    printf("sum = %d", sum);
    getc(stdin);
}

int add_int(int n, int m){
    return n + m;
}