C 学习笔记 —— 高级指针话题

2023-05-16

文章目录

    • 高级声明
    • 函数指针
      • 函数的指针作用
      • 赋值
      • 使用
    • 命令行参数
    • 字符串常量

高级声明

int f; //整型变量
int *f; //指向整型的指针变量
int *f, g;//一个指针变量和一个整型变量
int f(); //一个函数,返回值为整型
int *f(); //返回值类型为一个指向整型的指针
int (*f)(); //是一个函数指针,返回值类型为整型。因为每个函数都位于内存中的某个位置,那么函数指针就是指向该函数位置的指针。
int *(*f)();//也是一个函数指针,但是返回值类型为指向整型的指针。

int f[]; //声明一个数组,每个元素是int型
int *f[]; //声明一个数组,每个元素是指向整型的指针
int f()[]; //此声明是非法的
int f[](); //此声明是非法的
int (*f[])[]; //声明一个函数指针数组,返回值是int类型
int *(*f[])[]; //声明一个函数指针数组,返回值是指针类型

函数指针

char (* f) (int);写法就是函数指针的声明;
首先,什么是函数指针?
假设有一个指向 int类型变量的指针,该指针储存着这个int类型变量储存在内存位置的地址。
同样,每个函数都位于内存中的某个位置,函数也有地址,因为函数的机器语言实现由载入内存的代码组成。指向函数的指针中储存着函数代码的起始处的地址。那么函数指针就是指向该函数位置的指针

函数的指针作用

通常函数的指针作为 另一个函数的参数。
也就是当你想将一个函数作为参数传给另一个函数的时候,比如
我想在一个函数中使用其他任意函数,那么我就需要将其他函数作为参数传进来,如下:
void show(void (* fp)(char *), char * str);

比如C语言中<stdlib.h>中有个qsort
他的函数原型为

void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *))

各参数:

  1. 待排序数组首地址(可直接输入待排序数组名,或是指向数组的指针)
  2. 数组中待排序元素数量(可以用sizeof()来求)
  3. 各元素的占用空间大小(可以用sizeof(arr[0])来求)
  4. 指向函数的指针

qsort()函数可以处理任意类型的数组,但是要告诉 qsort()使用哪个函数来比较元素。为此, qsort()函数的参数列表中,有一个 参数接受指向函数的指针。然后,qsort()函数使用该函数提供的方案进行排序,无论这个数组中的元素是整数、字符串还是结构。例如,排序数组涉及比较两个元素,以确定先后。如果 元素是数字,可以使用>运算符;如果元素是字符串或结构,就要调用函数 进行比较

赋值

给函数指针赋值

void (*pf)(char *); //函数指针的声明
void ToUpper(char *); 
void ToLower(char *); 
int round(double); 

pf = ToUpper;   // 有效,ToUpper是该类型函数的地址 
pf = ToLower;   // 有效,ToUpper是该类型函数的地址 
pf = round;    // 无效,round与指针类型不匹配 
pf = ToLower();  // 无效,ToLower()不是地址

使用

void ToUpper(char *); 
void ToLower(char *); 
void (*pf)(char *); 
char mis[] = "Nina Metier"; 
pf = ToUpper; 
(*pf)(mis);  // 使用方式一:把ToUpper 作用于(语法1) 
pf = ToLower; 
pf(mis);   // 使用方式二:把ToLower 作用于(语法2)

这两种表示法其实等价,只不过第二种方式不是很好看。所以尽量使用第一种使用方式。

下面我们看一个具体实例:

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

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)
{
    
    void (*pfun)(char *); // points a function having a char * argument and no return value

    char choice = 'l';
    char line[] = "fanganFDNGlajf";
    char copy[81];
    switch (choice)  // switch sets pointer
    {
        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(pfun, copy);  // use selected function
    
    return 0;
}

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
}

最后我们可以看到函数名有四种用法
在这里插入图片描述

命令行参数

字符串常量

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 学习笔记 —— 高级指针话题 的相关文章

随机推荐