一.多级指针如何取名
在函数调用时,会体现出这样命名的优势;
int a = 10;
int *pi = &a;
int **ppi = π
int ***pppi = &ppi;
二.高级命名
//声明整型数据
int a;
//声明一级指针
int *pf;
//声明返回值为int的函数
int f();
//声明返回值为int *的函数
int * f();
//声明返回值为int的函数指针
int(*f)();
//声明返回值为int *的函数指针
int *(*f)();
//声明整型数组
int f[];
//声明整型指针数组
int * f[];
//声明返回值为int的函数数组
//非法,不允许
int f[]();
//声明返回值为整型数组的函数
//非法,不允许
int f()[];
//声明返回值为int的函数指针数组
int(*f[])();
//声明返回值为int *的函数指针数组
int * (*f[])();
三.函数指针的使用
- 函数指针在声明之后必须进行初始化才可以使用;
调用函数的方法:
int a;
int(*p)(int x) = &fun;
a = (*p)(5);
//a = p(5);
//a = fun(5);
1.回调函数 :一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当 这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
使用回调函数,需要做三件事:
- 声明函数
- 定义函数
- 设置触发条件:在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。
注:这里不需要再定义一个函数指针,因为函数名本身就是地址;
例:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
typedef void(*PF)(); //重命名函数指针
void func() //定义函数
{
printf("%d", 2);
}
void caller(PF pf) //函数地址作为形参被传入
{
pf(); //调用函数
}
int main()
{
PF p = func;
caller(p);
system("pause");
return 0;
}
例(qsort函数):
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
- 第一个形参为待排序数组;
- 第二个形参为数组成员个数;
- 第三个形参为成员数据类型大小;
- 第四个形参为回调的一个函数指针,用于排序;
//对整型数组排序
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
int cmp_int(const void *x, const void *y)
{
return *(int *)x - *(int *)y;
}
int main() {
int Arr[10] = { 11,22,55,66,44,22,33,77,88,11 };
int i = 0, len = 10;
printf("Before Qsort:\n");
for (; i < len; i++) {
printf("%d ", Arr[i]);
}
printf("\n");
qsort(Arr, 10, 4, cmp_int);
printf("After Qsort:\n");
for (i=0; i < len; i++) {
printf("%d ", Arr[i]);
}
printf("\n");
system("pause");
return 0;
}
//对字符型数组排序
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
int cmp_char(const void *x, const void *y)
{
return *(char *)x - *(char *)y;
}
int main() {
char Arr[10] = { 'z','a','c','b','d','e','f','a','c','h' };
int i = 0, len = 10;
printf("Before Qsort:\n");
for (; i < len; i++) {
printf("%c ", Arr[i]);
}
printf("\n");
qsort(Arr, 10, 1, cmp_char);
printf("After Qsort:\n");
for (i=0; i < len; i++) {
printf("%c ", Arr[i]);
}
printf("\n");
system("pause");
return 0;
}
2.转移表:运用函数指针数组,选择调用函数,从而替代switch语句;
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#pragma warning(disable:4996)
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("******1.Add 2.Sub 3.Mul***********************\n");
printf("*******4.Div 0.Exit************************\n");
}
void test()
{
int input = 1;
int x;
int y;
int ret = 0;
int(*p[5])(int, int) = { NULL,Add,Sub,Mul,Div };//函数指针数组
while (input)
{
menu();
printf("请选择:");
scanf("%d", &input);
if (input > 0 && input < 5)
{
printf("请输入操作数:");
scanf("%d%d", &x, &y);
ret = (*p[input])(x, y);//利用函数数组指针进行调用
printf("%d\n", ret);
}
else
printf("输入错误!\n");
}
}
int main()
{
test();
system("pause");
return 0;
}