【求助】关于C语言中指向函数的指针的问题(高手进!)

2025-05-13 21:25:46
推荐回答(4个)
回答1:

/* 一 */
#include
int f2(float c)
{
printf("%f\n",c);
}

void main()
{
int (*f)(); // 错误: 函数的形参是函数类型的一部分(返回值不是) 改成int (*f)(float);就好了。
float c=5;
printf("%f\n",c);
f=f2;
f(c);
getch();
}

/* main */ //修改后:(为什么这个却可以?)
/*
#include
int f2(float *c)
{
printf("%f\n",*c);
}
void main()
{
int (*f)(); // 这其实也是个错误,只不过被另一个隐式规则所掩盖,那就是形参的长度:
//指针的长度是C编译器默认的整型的长度,但float不是。
float *c,a=5;
c=&a;
printf("%f\n",*c);
f=f2;
(*f)(c); // 此处,(*f)(c) 与 f(c)语法上完全等价。不同的是 (*f)(c)暴露了你是生手。
// 楼上的两个回答也暴露了他们也是生手。不同的是,他们自以为不是。
getch();
}/* main */

楼主一定记住:
1. 函数的形参是函数类型的一部分,但返回值不是。
2.指针的类型必须完整。函数指针的类型信息包括入参的信息
3. 设f是函数指针,(*f)(c) 与 f(c)完全等价。但技术人员用后者。
原因 此时,操作符 () 与 []类似,已经解除引用。
(*f)(c) 的存在是编译器设计者的宽容。

-------------------------------------------------------------------
附件:microsoft C++ 汇编结果,供比较:
// 汇编:原型为 int (*f)();时的调用:
; 33 : //int (*f)(float);
; 34 : int (*f)();
; 35 : float c=5;

mov DWORD PTR _c$[ebp], 1084227584 ; 40a00000H

; 36 : printf("%f\n",c);

fld DWORD PTR _c$[ebp]
sub esp, 8
fstp QWORD PTR [esp]
push OFFSET FLAT:??_C@_03FBAH@?$CFf?6?$AA@ ; `string'
call _printf
add esp, 12 ; 0000000cH

; 37 : f=f2;

mov DWORD PTR _f$[ebp], OFFSET FLAT:_f2

; 38 : f(c);

fld DWORD PTR _c$[ebp]
mov esi, esp
sub esp, 8
fstp QWORD PTR [esp]
call DWORD PTR _f$[ebp]
add esp, 8
cmp esi, esp
call __chkesp

// 汇编:原型为 int (*f)(float);时的调用:

; 33 : int (*f)(float);
; 34 : //int (*f)();
; 35 : float c=5;

mov DWORD PTR _c$[ebp], 1084227584 ; 40a00000H

; 36 : printf("%f\n",c);

fld DWORD PTR _c$[ebp]
sub esp, 8
fstp QWORD PTR [esp]
push OFFSET FLAT:??_C@_03FBAH@?$CFf?6?$AA@ ; `string'
call _printf
add esp, 12 ; 0000000cH

; 37 : f=f2;

mov DWORD PTR _f$[ebp], OFFSET FLAT:_f2

; 38 : f(c);

mov esi, esp
mov eax, DWORD PTR _c$[ebp]
push eax
call DWORD PTR _f$[ebp]
add esp, 4
cmp esi, esp
call __chkesp

回答2:

明显是函数指针的用法你不了解。f = f2 表示的是将f2函数的首地址给f指针的地址内。(*f)(c)表示的是执行f地址里面所指的内容里面的东西,这里就是执行f2函数了。但是第一条程序的话是执行f函数,但是f不是函数,只是函数指针,所以有错误。

回答3:

?#includeint f2(float c){ printf("%f\n",c);}/* f2 */void main(){ int (*f)(); float c=5; printf("%f\n",c); f=f2; f(c); getch();}/* main */修改后:(为什么这个却可以?)#includeint f2(float *c){ printf("%f\n",*c);}/* f2 */void main(){ int (*f)(); float *c,a=5; c=&a; printf("%f\n",*c); f=f2; (*f)(c); getch();}/* main */

(*f)(c); 是使用函数指针调用函数的标准格式,f(c)是错误形式,这是一般函数的调用方式。

回答4:

什么玩意,这么乱!!