如何在函数指针中使用函数的地址?

5

我的下面的代码运行良好。但我有一点疑虑,请看 //Comment1//Comment2

#include<stdio.h>
#include<string.h>

struct PTR
{
    int (*funptr)(int);
};

int fun1(int)
{
    printf("Fun1\n");
    return 0;
}

int fun2(int)
{
    printf("Fun2\n");
    return 0;
}

int main()
{
    PTR p;
    p.funptr = &fun1; //Comment1
    p.funptr(5);

    printf("\n");

    p.funptr = fun2; //Comment2
    p.funptr(5);


  return 0;

}

输出: Fun1 Fun2

输出没有问题。

在comment1中使用了'&'运算符,所以我们明确告诉它获取地址,在comment2中,我们没有使用'&',那么哪种方式是正确的呢?


1
你如何在主函数中声明 PTR p,而不使用结构体名称或 typedef? - Raghu Srikanth Reddy
@RaghuSrikanthReddy PTR 是结构体的名称。(struct PTR) - Pranit Kothari
@RaghuSrikanthReddy 代码使用Visual Studio进行编译。没有任何理由不能编译此代码。您正在创建结构指针PTR,并使用它。只是为了澄清,在C ++中是否需要typedef类,不需要。类和结构体基本相同,只有一个小差别。 - Pranit Kothari
1
我使用gcc编译了这段代码。而且这个问题标记为C,不是C++。 - Raghu Srikanth Reddy
@RaghuSrikanthReddy 目前我的虚拟机的Ubuntu系统无法工作,但是问题出在哪里呢?为什么我需要使用typedef struct? - Pranit Kothari
显示剩余3条评论
2个回答

1
这里,p.funptr = &fun1我们正在提供函数的地址。因此,在p.funptr = fun1中,'&'是可选的,也可以分配函数的地址。

1
"

'&'在获取函数地址时是可选的。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接