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

文章目录

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

一、函数指针定义

1.函数指针的含义

在这里插入图片描述

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

(1)
在这里插入图片描述

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

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

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

在这里插入图片描述

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

在这里插入图片描述
(第14章)《C Primer Plus》学习笔记——函数指针_第2张图片

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

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

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

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

二、重要例子

代码如下

// func_ptr.c -- uses function pointers
#include 
#include 
#include 

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》学习笔记——函数指针_第5张图片
解释说明如下:
(1)函数指针的使用在这里插入图片描述
(第14章)《C Primer Plus》学习笔记——函数指针_第6张图片

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

(第14章)《C Primer Plus》学习笔记——函数指针_第7张图片
(3)其他技巧:把输入字符转换为大小写
(第14章)《C Primer Plus》学习笔记——函数指针_第8张图片
(4)其他技巧:eatline()函数:清除剩余行
(第14章)《C Primer Plus》学习笔记——函数指针_第9张图片
(5)其他技巧:strchr()库函数的用法解释
(第14章)《C Primer Plus》学习笔记——函数指针_第10张图片
在这里插入图片描述

你可能感兴趣的:(C)