gpt4 book ai didi

c - 函数指针类型

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:46 24 4
gpt4 key购买 nike

我有一个简短的程序,我将用它来测试“无限递归”。然而,我遇到了另一个与函数指针相关的棘手问题......

程序如下:

#include <stdio.h>

int repeat(char (*func)(int, int), int a) {
func(a, a+1);
return repeat(func, a+1);
}

char f (int a , int b){
printf("%d\n", a);
//return (double)(a + b);
return 'c';
}

int main(int argc, char const *argv[])
{
repeat(&f, 1);
return 0;
}

至于我,我认为“repeat(&f, 1)”中的'f'的类型是“char *”,而'func'在“int repeat(char (*func)(int, int), int a)”的类型也是“char *”。

然而,这似乎很奇怪。如果我将“(char (*func)(int, int), int a)”更改为“(char func(int, int), int a)”,编译器(在gcc和vc6中测试)没有给出任何警告,运行结果是一样的。

如果我将“(char (*func)(int, int), int a)”更改为“(double func(int, int), int a)>”,编译器抛出:

警告:不兼容的指针类型将“char ()(int, int)”传递给类型为“double ()(int, int)”的参数 [-Wincompatible-pointer-types ] 重复(&f, 1);

编译器似乎将“double (int, int)”和“double (*)(int, int)”视为相同的东西。换句话说,如果我将“(char (*func)(int, int), int a)”更改为“double (*func)(int, int) ",编译器会抛出同样的信息(我已经测试过了):

警告:不兼容的指针类型将“char ()(int, int)”传递给类型为“double ()(int, int)”的参数 [-Wincompatible-pointer-types ] 重复(&f, 1);

上帝...好吧,这还没有结束。之后,我将“repeat(&f, 1)改为“repeat(f, 1)”,其他部分不变。即整个程序是:

#include <stdio.h>

int repeat(char (*func)(int, int), int a) {
func(a, a+1);
return repeat(func, a+1);
}

char f (int a , int b){
printf("%d\n", a);
//return (double)(a + b);
return 'c';
}

int main(int argc, char const *argv[])
{
repeat(f, 1);
return 0;
}

编译器没有给出任何警告,运行结果相同。

所以我很困惑以下所有巴黎都没有产生警告和正确的结果。

    1   repeat(&f, 1)   int repeat(char (*func)(int, int), int a)
2 repeat(&f, 1) int repeat(char func(int, int), int a)
3 repeat(f, 1) int repeat(char (*func)(int, int), int a)
4 repeat(f, 1) int repeat(char func(int, int), int a)

当然“repeat(f, 1)”中的'f'的类型是“char (int, int)”,而'func'在“int repeat(double (func)(int, int), int a)”中具有“char ( )(int, int)”。

您可以通过将“int repeat(char (*func)(int, int), int a)”更改为“int repeat(double (*func)(int , int), int a) ”并查看警告信息:

警告:不兼容的指针类型将“char (int, int)”传递给类型为“double ()(int, int)”的参数 [-Wincompatible-pointer-types] repeat(f, 1);*

谁能给点意见?关于类型,我完全认为只有四个中的第一个是正确的。

最佳答案

当用作函数参数时,两种语法

foo(char bar(int, int), int a)  

foo(char (*bar)(int, int), int a)

从编译器的角度来看是相同的。

另请注意,当您调用函数 foo 时,传递给它的函数名称被视为指向该函数的指针。这两个调用都是有效的

foo(&f, 1)
foo(f, 1)

As for me, I think the f in repeat(&f, 1) has the type of char * and the func in int repeat(char (*func)(int, int), int a) has the type of char *,too.

没有。 ffunc 都是 char (*)(int, int) 类型,即它们是指向以两个 int 作为参数并返回 char

的函数

关于c - 函数指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26827862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com