理解C中的函数指针的问题

时间:2015-02-28 11:15:38

标签: c

我在理解传递任何参数的函数指针时遇到问题。请找到示例程序供您参考。在这里,我想打印两个数字的总和。 print()接受函数指针作为其参数。但是我无法将参数从main()传递给函数。

#include<stdio.h>

int sum(int, int);
void print(int (*p)(int,int));

int main()
{
        int a=2;
        int b=5;
        print(sum(a,b));
}

void print(int (*p)(int a,int b))
{

        printf("%d",p(a,b)); //a and b are not defined as per compiler

}

int sum(int a, int b)
{
        return a+b;
}

3 个答案:

答案 0 :(得分:3)

进行此声明时

void print(int (*p)(int a,int b))

你声明一个函数print,它接受​​一个函数指针p,它需要两个int并返回一个int。名称ab并不代表任何内容 - 编译器会忽略它们。事实上,你可以省略它们:

void print(int (*p)(int,int))

如果您想传递两个要添加的数字,请将它们作为单独的参数传递:

void print(int (*p)(int,int), int a, int b)

现在你的print将会编译。电话会看起来像这样:

print(sum, a, b);

这是因为当您编写print(sum(a, b))时,您正在指示编译器使用参数suma 调用 b,获取其结果,并传递给print。但是,如果单独传递sum,没有括号,则表示函数指针。

答案 1 :(得分:1)

程序看起来像

#include<stdio.h>

int sum( int, int );
void print( int ( * )( int, int ), int, int );
// or more simpler
void print( int ( int, int ), int, int );

int main()
{
        int a = 2;
        int b = 5;

        print( sum, a, b);
}

void print( int ( *p )( int,int ), int a, int b )
{

        printf( "%d", p( a, b ) ); //a and b are not defined as per compiler

}

int sum( int a, int b )
{
        return a + b;
}

考虑到这些声明是等效的并且声明了相同的函数

void print( int ( * )( int, int ), int, int );
// or more simpler
void print( int ( int, int ), int, int );

对于原始代码,函数print只有一个参数:函数指针。所以你可以传递给函数print只有一个参数:一些函数。您可以通过以下方式定义功能打印

void print( int ( *p )( int,int ) )
{
        int a = 2, b = 5;

        printf( "%d", p( a, b ) ); //a and b are not defined as per compiler

}

或者您可以使用三个参数定义函数打印,函数的用户可以自己在打印体内指定被调用函数的参数。

void print( int ( *p )( int,int ), int a, int b )
{

        printf( "%d", p( a, b ) ); //a and b are not defined as per compiler

}

答案 2 :(得分:0)

让我们从一个基本功能开始,我们将指向:

int addInt(int n, int m) {
    return n+m;
}

首先,让我们定义一个指向函数的指针,该函数接收2个int并返回int:

int (*functionPtr)(int,int);

现在我们可以安全地指出我们的功能:

functionPtr = &addInt;

现在我们有了一个指向该函数的指针,让我们使用它:

int sum = (*functionPtr)(2, 3); // sum == 5

将指针传递给另一个函数基本相同:

int add2to3(int (*functionPtr)(int, int)) {
    return (*functionPtr)(2, 3);
}

我们也可以在返回值中使用函数指针(尝试跟上,它会变得混乱):

// this is a function called functionFactory which receives parameter n
// and returns a pointer to another function which receives two ints
// and it returns another int
int (*functionFactory(int n))(int, int) {
    printf("Got parameter %d", n);
    int (*functionPtr)(int,int) = &addInt;
    return functionPtr;
}

但是使用typedef要好得多:

typedef int (*myFuncDef)(int, int);
// note that the typedef name is indeed myFuncDef

myFuncDef functionFactory(int n) {
    printf("Got parameter %d", n);
    myFuncDef functionPtr = &addInt;
    return functionPtr;
}

免责声明:此代码未必编译,如果您发现任何错误,请随时编辑。