位于Head Frist C第318页:
函数名是指向函数的指针
-
函数名
也是指针变量
。 - 当你创建一个函数的同时,也会创建一个
同名
的指针变量。 -
变量
中保存可函数的地址
。
函数指针和指针并不是完全相同
-
函数名
不能像指针变量
那样自加
或自减
。 -
不能像声明指针那样声明函数指针,因为没
函数类型
。 -
函数没有类型,是因为函数的类型不止一种,例如返回类型或形参列表等,函数类型由这些东西的组合定义。
int go_to _warp_seed(int speed)
{
...
}
char ** album_names(char *artist,int year)
{
...
}
>因此函数指针的表似乎方法更复杂
####创建函数指针
要创建两个指针变量用来保存上面两个函数的地址:
int (*warp_fn)(int);
warp_fn = go_to_warp_speed;
//创建一个叫warp_fn的变量,用来保存go_to_warp_speed()函数的地址。
warp_fn(4);
//相当于调用go_to_warp_speed(4);
char** (names_fn)(char ,int);
names_fn = album_names;
char** results = names_fn("Sacha Fistel",1972);
* 需要包函数的返回类型和接收参数的类型告诉C编译器,
* 一旦声明的指针变量,就可以像其他变量一样使用它。
* `char**` 是一个指针,通常用来指向字符串数组。
####测试代码
include <stdio.h>
include <string.h>
int NUM_ADS = 7;
char *ADS[] ={
"William: SBM GSOH likes sports,TV,dining",
"Martt: SWM NS likes art,movies,theater",
"Luis: SLM NUM_ADS likes books,theater,art",
"Mike: DWM DS likes trucks, sports and bieber",
"Peter: SAM likes chess, working out and art",
"Josh: SJM likes sports, movies and theater",
"Jed: DBM likes theater,books and dining",
};
int sports_no_bieber(char *s)
{
return strstr(s,"sports") && !strstr(s,"bieber");
}
int sports_or_workout(char *s)
{
return strstr(s,"sports") || strstr(s,"working out");
}
int ns_theater(char *s)
{
return strstr(s,"NS") && strstr(s,"theater");
}
int arts_theater_or_dining(char *s)
{
return strstr(s,"arts") || !strstr(s,"theater") || strstr(s,"dining");
}
void find(int (match)(char))
{
int i;
puts("Search results:");
puts("----------------------------------");
for (int i = 0; i < NUM_ADS; ++i)
{
if (match(ADS[i]))
{
printf("%s\n",ADS[i]);
}
}
puts("----------------------------------");
}
int main()
{
find(sports_no_bieber);
find(sports_or_workout);
find(ns_theater);
find(arts_theater_or_dining);
return 0;
}
![函数指针.jpg](https://img.haomeiwen.com/i50144/d0fdda958577aac4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* 代码中`match(ADS[i])`也可以写成`(*match)(ADS[i])`。
* `find(sports_or_workout)`也可以写成find(&sports_or_workout).
* 即使省略了`*`和`&`,C语言野认识它们,这样的代码更好读。
网友评论