我是丹麦的一名当地程序员,试图用他的C exsam帮助一位朋友。
他需要学会阅读某些代码设计,就像这一样。但是我不能在结果来自哪里做出正面或反面...有人请帮助我理解它,所以我可以帮助他:
#include <stdio.h>
#include <stdlib.h>
int func1(int);
void func2(int(*fp)(int), int);
void main(){
int (*fp)(int);
fp = func1;
(*fp)(1);
func2(fp,(*fp)(2));
}
int func1(int arg){
printf("Func1 %d\n", arg);
return arg;
}
void func2(int(*fp)(int), int arg){
printf("Func2 %d\n",arg+fp(arg));
}
我知道anser是: Func1 1 Func1 2 Func1 2 Func2 4
但是为什么会这样!高于我的薪水。
我明白在void main()
中我们会产生一个int ...然而这个看起来很糟糕。
然后我们致电有效运行fp = func1;
的{{1}}
文本应该是“Func 1(在这里插入arg)。我不明白为什么这会给出数字1。
然后它在这里做了一些事情printf("Func1 %d\n", arg);
meaby某种指针的东西???
我无法理解为什么它连续3次运行(*fp)(1);
,而且数字来自哪里?
其余的代码没有更好的
答案 0 :(得分:0)
int (*fp)(int);
创建一个指向接受名为fp
fp = func1;
将fp
设置为func1
(*fp)(1);
来电*fp
,func1
,1
=&gt;打印Func1 1
func2(fp,(*fp)(2));
使用*fp
调用func1
,2
。然后,它会调用func2
,其结果为2
,fp
当前为2
=&gt;打印Func1 2 Func1 2 Func2 4
答案 1 :(得分:0)
此代码最令人困惑的方面是函数指针的错综复杂使用。
void func2(int(*fp)(int), int);
函数func2
的声明是接受名为fp
的函数指针和整数作为参数。 fp
是指向接受int
参数并返回int
的函数的指针。由于此行是声明,因此可以将其改为void func2(int(*)(int), int);
。这里不一定非常需要函数指针的名称(但稍后将在定义中)。
main
声明指向函数int (*fp)(int);
的指针,并将其设置为指向func1
。这是可能的,因为func1
的声明与指针所期望的类型匹配。
然后我们调用fp
指向的函数:(*fp)(1);
。请注意,第一组括号将星号与指针名称分组,而不是函数的返回值。换句话说,它表示取消引用指针并在该位置调用函数,而不是调用函数并取消引用返回值。
在C的大多数版本中,可以省略指针符号,并且可以调用函数指针,就好像它们本身就是函数一样。此行可以重写为fp(1);
。实际上,这是用于在fp
中调用func2
的符号。
接下来,我们使用func2
和fp (== func1)
的结果调用fp(2)
。
总的来说,预期的打印输出(附注释解释):
Func1 1 // (*fp)(1); in main()
Func1 2 // Evaluating the argument (*fp)(2) to func2() in main()
Func1 2 // Evaluating the argument fp(arg) to printf() in func2()
Func2 4 // Printing the result of arg==2 + fp(arg)==2 in func2()
答案 2 :(得分:0)
逐行拍摄,进行一些格式更改和一些更正:
#include <stdio.h>
#include <stdlib.h>
/**
* Declarations for func1 and func2
*/
int func1(int);
void func2(int(*fp)(int), int);
int main( void ) // main always returns int
{
int (*fp)(int); // fp is a *pointer* to a function taking a single int parameter
// and returning an int value
fp = func1; // assign the *address* of func1 to fp
(*fp)(1); // call func1 through the pointer fp with an argument of 1
func2(fp,(*fp)(2)); // call func1 through fp again with a value of 2;
// pass that result, along with the value of fp
// (which is the address of func1) to func2.
}
/**
* Print the input argument, return the value of the input argument
*/
int func1(int arg){
printf("Func1 %d\n", arg);
return arg;
}
/**
* Call the function pointed to by fp with the input argument, add the
* result to the input argument, print out the final value
*/
void func2(int(*fp)(int), int arg){
printf("Func2 %d\n",arg+fp(arg));
}
在上面的代码中,fp
是一个带有int
参数并返回int
结果的函数的指针。我们将func1
的地址分配给fp
,然后我们通过<{1}}指针调用func1
。该代码基本上等同于:
fp
函数指针非常有用,一些显示在标准库中,例如qsort
库函数。