文章目录

  • ​​一、函数指针定义​​
  • ​​1.函数指针的含义​​
  • ​​2.函数指针的声明必须要指出函数的返回类型和形参类型​​
  • ​​(2)void (*pf)(char *) 与void *pf(char *)的区别​​
  • ​​(3)如何写个函数指针?​​
  • ​​3.函数名是函数的地址,函数指针如何用函数名​​
  • ​​4.函数指针的两种写法(前者为主),(*pf)(mis)等价于pf(mis)​​
  • ​​5.函数指针和数据指针的使用​​
  • ​​二、重要例子​​
  • ​​(2)使用函数名的4种方法​​

一、函数指针定义

1.函数指针的含义

(第14章)《C Primer Plus》学习笔记——函数指针_#include

2.函数指针的声明必须要指出函数的返回类型和形参类型

(1)

(第14章)《C Primer Plus》学习笔记——函数指针_#include_02

(2)void (*pf)(char *) 与void *pf(char *)的区别

(第14章)《C Primer Plus》学习笔记——函数指针_数据_03

(3)如何写个函数指针?

(第14章)《C Primer Plus》学习笔记——函数指针_数据_04

3.函数名是函数的地址,函数指针如何用函数名

(第14章)《C Primer Plus》学习笔记——函数指针_#include_05


(第14章)《C Primer Plus》学习笔记——函数指针_函数指针_06

4.函数指针的两种写法(前者为主),(*pf)(mis)等价于pf(mis)

(第14章)《C Primer Plus》学习笔记——函数指针_#include_07

5.函数指针和数据指针的使用

(第14章)《C Primer Plus》学习笔记——函数指针_数据_08

二、重要例子

代码如下

// func_ptr.c -- uses function pointers
#include <stdio.h>
#include <string.h>
#include <ctype.h>

char showmenu(void);
void eatline(void); // read through end of line
void show(void (* fp)(char *), char * str);
void ToUpper(char *); // convert string to uppercase
void ToLower(char *); // convert string to uppercase
void Transpose(char *); // transpose cases
void Dummy(char *); // leave string unaltered

int main(void)
{
char line[81];
char copy[81];
char choice;
void (*pfun)(char *); // points a function having a
// char * argument and no
// return value
//声明一个函数指针,被指向的函数接受char *类型的参数, 无返回值

puts("Enter a string (empty line to quit):");

eatline();


while (gets(line) != NULL && line[0] != '\0')
{
while ((choice = showmenu()) != 'n')
{
switch (choice ) // switch sets pointer//switch语句设置指针
{
case 'u' : pfun = ToUpper; break;
case 'l' : pfun = ToLower; break;
case 't' : pfun = Transpose; break;
case 'o' : pfun = Dummy; break;
}
strcpy(copy, line);// make copy for show()//为show函数拷贝一份
show(pfun, copy); // use selected function//根据用户的选择,使用选定的函数
}
puts("Enter a string (empty line to quit):");
}
puts("Bye!");

return 0;
}

char showmenu(void)
{
char ans;
puts("Enter menu choice:");
puts("u) uppercase l) lowercase");
puts("t) transposed case o) original case");
puts("n) next string");
ans = getchar(); // get response获取用户的输入,单独占一行
ans = tolower(ans); // convert to lowercase转换为小写
eatline(); // dispose of rest of line清理输入行
while (strchr("ulton", ans) == NULL)//ans没有找到字符串ulton里的任意字符,就返回NULL
{
puts("Please enter a u, l, t, o, or n:");
ans = tolower(getchar());
eatline();
}

return ans;
}

void eatline(void)
{
while (getchar() != '\n')
continue;
}

void ToUpper(char * str)
{
while (*str)
{
*str = toupper(*str);
str++;
}
}

void ToLower(char * str)
{
while (*str)
{
*str = tolower(*str);
str++;
}
}
void Transpose(char * str)
{
while (*str)
{
if (islower(*str))
*str = toupper(*str);
else if (isupper(*str))
*str = tolower(*str);
str++;
}
}

void Dummy(char * str)
{
// leaves string unchanged
}

void show(void (* fp)(char *), char * str)
{
(*fp)(str); // apply chosen function to str
puts(str); // display result
}

(第14章)《C Primer Plus》学习笔记——函数指针_#include_09


解释说明如下:

(1)函数指针的使用

(第14章)《C Primer Plus》学习笔记——函数指针_函数指针_10


(第14章)《C Primer Plus》学习笔记——函数指针_#include_11

(2)使用函数名的4种方法

(第14章)《C Primer Plus》学习笔记——函数指针_数据_12


(3)其他技巧:把输入字符转换为大小写

(第14章)《C Primer Plus》学习笔记——函数指针_数据_13


(4)其他技巧:eatline()函数:清除剩余行

(第14章)《C Primer Plus》学习笔记——函数指针_数据_14


(5)其他技巧:strchr()库函数的用法解释

(第14章)《C Primer Plus》学习笔记——函数指针_#include_15


(第14章)《C Primer Plus》学习笔记——函数指针_数据_16