如何阅读此C代码? exsam准备

时间:2016-11-14 17:11:52

标签: c

我是丹麦的一名当地程序员,试图用他的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);,而且数字来自哪里?

其余的代码没有更好的

3 个答案:

答案 0 :(得分:0)

int (*fp)(int);创建一个指向接受名为fp

的整数的函数的新指针

fp = func1;fp设置为func1

(*fp)(1);来电*fpfunc11 =&gt;打印Func1 1

func2(fp,(*fp)(2));使用*fp调用func12。然后,它会调用func2,其结果为2fp当前为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的符号。

接下来,我们使用func2fp (== 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库函数。