指针函数和函数指针

指针函数其实是一个简称,是指带指针的函数,它本质上是一个函数,只是返回的是某种类型的指针。其定义的格式为:


  1. 类型标识符 *函数名(参数表) 



函数指针,从本质上说是一个指针,只是它指向的不是一般的变量,而是一个函数。因为每个函数都有一个入口地址,函数指针指向的就是函数的入口地址。其定义的格式为:

  1. 类型标识符 (*指针变量名)(形参列表) 


接下来,通过分析下面的代码加深读者对指针函数和函数指针的理解。代码的功能为在输入字符串中查找指定的字符,如果查找成功,则打印出所查找字符后面的字符串,如果查找失败,则给出提示信息。


#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 ;  
}



运行结果:

  1. 请输入字符串:Never forget to say thanks!  
  2. 请输入要搜索的字符串:say  
  3. 直接调用函数serch_str()  
  4. 所搜索字符串之后的字符为: thanks!  

  5. 请输入字符串:Keep on going never give up!  
  6. 请输入要搜索的字符串:going  
  7. 使用函数指针fun调用函数serch_str()  
  8. 所搜索字符串之后的字符为:never give up! 



分析上面的代码,其中定义函数指针的形式为“char* (*fun)(char *str,char *substr);”,其所指向函数的返回类型为字符指针,所带参数是两个字符指针。在代码的实现中有些需要注意的地方,如在strlen()函数中通过一个结束符来判断字符串的长度,这是因为在输入字符串后面会自动添加一个结束符。由运行结果可知,采用了两种方式来实现函数的调用,一种是直接调用,即通过serch_str()函数来实现;另外一种是使用函数指针的方式来调用,即通过函数指针fun来实现,在调用之前,先使函数指针fun指向serch_str函数的入口地址,之后才能按照调用serch_str()函数的方式来使用。在使用函数指针的时候,需要注意函数指针要与它所指向的函数具有相同的类型,在用函数指针指向函数的时候是用“函数指针名=函数名”的方式来引用函数的。函数serch_str()是一个指针函数,返回的是一个字符指针。