[英]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 之前,因此ADS
对finding
内部的代码是可见的。 (如果可以避免,使用这样的外部标识符通常被认为是糟糕的设计。)
在此 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.