高级声明
int f;
int *f;
int *f, g;
int f();
int *f();
int (*f)();
int *(*f)();
int f[];
int *f[];
int f()[];
int f[]();
int (*f[])[];
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 *))
各参数:
- 待排序数组首地址(可直接输入待排序数组名,或是指向数组的指针)
- 数组中待排序元素数量(可以用sizeof()来求)
- 各元素的占用空间大小(可以用sizeof(arr[0])来求)
- 指向函数的指针
qsort()函数可以处理任意类型的数组,但是要告诉 qsort()使用哪个函数来比较元素。为此, qsort()函数的参数列表中,有一个 参数接受指向函数的指针。然后,qsort()函数使用该函数提供的方案进行排序,无论这个数组中的元素是整数、字符串还是结构。例如,排序数组涉及比较两个元素,以确定先后。如果 元素是数字,可以使用>运算符;如果元素是字符串或结构,就要调用函数 进行比较
赋值
给函数指针赋值
void (*pf)(char *);
void ToUpper(char *);
void ToLower(char *);
int round(double);
pf = ToUpper;
pf = ToLower;
pf = round;
pf = ToLower();
使用
void ToUpper(char *);
void ToLower(char *);
void (*pf)(char *);
char mis[] = "Nina Metier";
pf = ToUpper;
(*pf)(mis);
pf = ToLower;
pf(mis);
这两种表示法其实等价,只不过第二种方式不是很好看。所以尽量使用第一种使用方式。
下面我们看一个具体实例:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void show(void (* fp)(char *), char * str);
void ToUpper(char *);
void ToLower(char *);
void Transpose(char *);
void Dummy(char *);
int main(void)
{
void (*pfun)(char *);
char choice = 'l';
char line[] = "fanganFDNGlajf";
char copy[81];
switch (choice)
{
case 'u' : pfun = ToUpper; break;
case 'l' : pfun = ToLower; break;
case 't' : pfun = Transpose; break;
case 'o' : pfun = Dummy; break;
}
strcpy(copy, line);
show(pfun, copy);
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)
{
}
void show(void (* fp)(char *), char * str)
{
(*fp)(str);
puts(str);
}
最后我们可以看到函数名有四种用法
![在这里插入图片描述](https://img-blog.csdnimg.cn/8ae8ef37c7c84b2ebdbc1f0ba2586fc1.png)
命令行参数
字符串常量
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)