指针函数和函数指针
指针函数其实是一个简称,是指带指针的函数,它本质上是一个函数,只是返回的是某种类型的指针。其定义的格式为:
- 类型标识符 *函数名(参数表)
函数指针,从本质上说是一个指针,只是它指向的不是一般的变量,而是一个函数。因为每个函数都有一个入口地址,函数指针指向的就是函数的入口地址。其定义的格式为:
- 类型标识符 (*指针变量名)(形参列表)
接下来,通过分析下面的代码加深读者对指针函数和函数指针的理解。代码的功能为在输入字符串中查找指定的字符,如果查找成功,则打印出所查找字符后面的字符串,如果查找失败,则给出提示信息。
#include <stdio.h>
char* (*fun)(char *str,char *substr);
void input(char *str,char *substr)
{
printf("请输入字符串:");
gets(str);
printf("请输入要搜索的字符串:");
gets(substr);
}
int strlen(char *str)
{
int i=0;
while(str[i]!='\0')
i++;
return i;
}
char* serch_str(char *str,char *serch_str)
{
int i,j,k;
k = strlen(str) - strlen(serch_str);
if ( k > 0 && NULL!=str && NULL!=serch_str)
{
for ( i = 0; i <= k; i++ )
for ( j = i; str[j] == serch_str[j-i]; j++ )
if ( serch_str[j-i+1] == '\0' )
return str+i+strlen(serch_str);
}
return NULL;
}
void print(char* ret_str)
{
if ( ret_str !=NULL )
printf("所搜索字符串之后的字符为:%s\n",ret_str);
else
printf("没有找到所要搜索的字符串\n");
}
void main()
{
char str1[50],str2[50];
char serch_str1[50],serch_str2[50];
char* ret_str1,* ret_str2;
input(str1,serch_str1);
ret_str1 = serch_str(str1,serch_str1);
printf("直接调用函数serch_str()\n");
print(ret_str1);
input(str2,serch_str2);
fun = serch_str;
ret_str2 = fun(str2,serch_str2);
printf("使用函数指针fun调用函数serch_str()\n");
print(ret_str2);
return ;
}
运行结果:
- 请输入字符串:Never forget to say thanks!
- 请输入要搜索的字符串:say
- 直接调用函数serch_str()
- 所搜索字符串之后的字符为: thanks!
- 请输入字符串:Keep on going never give up!
- 请输入要搜索的字符串:going
- 使用函数指针fun调用函数serch_str()
- 所搜索字符串之后的字符为:never give up!
分析上面的代码,其中定义函数指针的形式为“char* (*fun)(char *str,char *substr);”,其所指向函数的返回类型为字符指针,所带参数是两个字符指针。在代码的实现中有些需要注意的地方,如在strlen()函数中通过一个结束符来判断字符串的长度,这是因为在输入字符串后面会自动添加一个结束符。由运行结果可知,采用了两种方式来实现函数的调用,一种是直接调用,即通过serch_str()函数来实现;另外一种是使用函数指针的方式来调用,即通过函数指针fun来实现,在调用之前,先使函数指针fun指向serch_str函数的入口地址,之后才能按照调用serch_str()函数的方式来使用。在使用函数指针的时候,需要注意函数指针要与它所指向的函数具有相同的类型,在用函数指针指向函数的时候是用“函数指针名=函数名”的方式来引用函数的。函数serch_str()是一个指针函数,返回的是一个字符指针。