指針函數與函數指針

一、指針函數與函數指針的定義

1、指針函數

指針函數是指帶指針的函數,它的本質上是一個函數,只是返回的是某種類型的指針。

類型標識符 *函數名(形參列表)

2、函數指針

函數指針,從本質上來說,它是一個指針,只是它指向的不是一般的變量,而是一個函數。

因為每一個函數都有一個入口地址,函數指針指向的就是函數的入口地址。

類型標識符 (*函數名)(形參列表)

二、以代碼分析指針函數與函數指針

1、源代碼

#include 

// 聲明一個函數指針
char* (*fun)(char *str, char *substr);

// 輸入字符串
void input(char *str, char *substr)
{
printf("請輸入字符串");
gets_s(str,99);
printf("請輸入你要搜索的字符:");
gets_s(substr, 99);
}

// 計算字符串的長度不包含'\\0'
int strlen(char *str)
{
int i = 0;
while (str[i] != '\\0')
i++;
return i;
}

// 輸出匹配字符串之後的所有字符
char* search_str(char *str, char *search_str)
{
int i, j, k;
k = strlen(str) - strlen(search_str);

if (k > 0 && NULL != str && NULL != search_str)
{
for (i = 0;i<=k;i++)
{
for (j = i;str[j]==search_str[j-i];j++)
{
if (search_str[j-i+1]=='\\0')
{
return str + i + strlen(search_str);
}
}
}
}
return NULL;
}

void print(char *ret_str)
{
if (ret_str!=NULL)
{
printf("所搜索的字符串之後的字符為:%s\\n", ret_str);

}
else
{
printf("沒有找到索要搜索的字符串\\n");
}
}

int main()
{
char str1[100], str2[100];
char search_str1[100], search_str2[100];

char *ret_str1, *ret_str2;

input(str1, search_str1);

ret_str1 = search_str(str1, search_str1);
printf("直接調用search_str()\\n");
print(ret_str1);

input(str2, search_str2);

// 函數指針指向函數的入口地址
fun = search_str;

ret_str2 = fun(str2, search_str2);

printf("使用函數指針fun調用函數search_str()\\n");

print(ret_str2);

getchar();
return 0;
}

2、運行結果

指針函數與函數指針

3、使用函數指針時需要注意的事項

在使用函數指針的時候,需要注意函數指針要與它所指的函數具有相同的類型,在用函數指針指向函數的時候,用"函數指針名 = 函數名"的形式來引用函數。函數search_str()是一個指針函數,返回的是一個字符指針。


分享到:


相關文章: