Head First C学习之"函数"指针

位于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

include

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](http://upload-images.jianshu.io/upload_images/50144-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语言野认识它们,这样的代码更好读。

你可能感兴趣的:(Head First C学习之"函数"指针)