繁体   English   中英

关于 C 中的 function 指针 [重复]

[英]About function pointers in C [duplicate]

在下面finding function 有什么魔力?

1)什么是允许在没有事先声明的情况下使用match的内部机制?

2)在main中, finding调用不应该与sports_no_trucks一起传递数组ADS吗?

提前致谢!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int NUM_ADS = 2;
char *ADS[] = {
    "Luis: SLM ND likes sports, theater, art",
    "Mike: DWM DS likes trucks, sports"
};

void finding(int (*match) (char *))
{
    int i;
    puts("Search results:");
    puts("------------------------------------");
    for (i = 0; i < NUM_ADS; i++)
    {
        if (match(ADS[i]))
        {
            printf("%s\n", ADS[i]);
        }
    }
    puts("------------------------------------");
}

int sports_no_trucks(char *s)
{
    return strstr(s, "sports") && !strstr(s, "trucks");
}


int main()
{

    finding(sports_no_trucks);
    return 0;
}

int name(char *s)name声明为 function 接受一个char *s参数并返回一个int

int (*name)(char *s)name声明为指向该类型的 function 的指针。

void finding(int (*match) (char *))中,我们看到如上所述声明的参数match

1)什么是允许在没有事先声明的情况下使用match的内部机制?

match在使用前声明; void finding(int (*match) (char *))中,它被声明为finding Finding 的参数,具有上述类型。

2)在main中, finding调用不应该与sports_no_trucks一起传递数组ADS吗?

不必这样做,因为ADS是在任何finding之外声明的,并且在定义 find 之前,因此ADSfinding内部的代码是可见的。 (如果可以避免,使用这样的外部标识符通常被认为是糟糕的设计。)

在此 function 声明中

void finding(int (*match) (char *));

声明了一个名称为match的参数,其类型为指向int( char * )类型的 function 的指针。 那就是参数match本身的类型为int ( * )( char * )

在 function 的调用中finding

finding(sports_no_trucks);

有作为参数传递 function 指示符sports_no_trucks对应于 function 的以下定义

int sports_no_trucks(char *s)
{
    return strstr(s, "sports") && !strstr(s, "trucks");
}

因此,function finding的参数match得到指向 function sports_no_trucks的指针的值,因为 function 函数中使用的指示符被转换为指向表达式的指针。

您可以想象 function finding的定义及其调用方式如下

finding(sports_no_trucks);

//...

void finding( /* int (*match) (char *) */ )
{
    int ( *match )( char * ) = sports_no_trucks;
    //...
}

为了更清楚,您可以引入一个 typedef 名称,例如

typedef int FN( char * );

在这种情况下,function 发现的声明将如下所示

void finding( FN *match );

其中FN是 function 类型int( char * )的别名。

2)主要是,发现调用不应该与sports_no_trucks一起传递数组ADS吗?

声明为全局变量的数组

int NUM_ADS = 2;
char *ADS[] = {
    "Luis: SLM ND likes sports, theater, art",
    "Mike: DWM DS likes trucks, sports"
};

并且 function finding可以访问它,因为它在程序的文件 scope 中可见

for (i = 0; i < NUM_ADS; i++)
{
    if (match(ADS[i]))
    {
        printf("%s\n", ADS[i]);
    }
}

但你是对的。 当函数依赖于全局变量时,这是一种糟糕的编程风格。 在这种情况下,您无法为另一个阵列调用 function。 所以这个function不是一般的function。 它非常具体,只能处理一个数组。

无需将数组声明为全局数组并定义依赖于全局数组的 function。

在这种情况下,function 声明看起来像

void finding( char * s[], size_t n, int (*match) (char *));

并且可以为阵列 ADS 调用 function,例如

finding( ADS, NUM_ADS, sports_no_trucks );

但是可以以相同的方式为任何其他数组调用它

finding( AnotherArray, ItsSize, sports_no_trucks );

也许这种形式会更容易理解

typedef int functype(char *);

void finding(functype *func)
{
    /* ... */    
}

functype是 function 的类型,返回int并采用char *

functype *func是一个指向这个类型的指针。 现在它看起来像任何其他指针

ADS 是一个全局变量,可以在程序的任何地方访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM