函数指针使用方法(转移表)
nt 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 mune()
{
printf("**********1add 2,sub*********\n");
printf("**********3mul 4,div*********\n");
printf("*********** 0exit *************\n");
}
int main()
{
int(*parr[5])(int, int) = { 0,add,sub,mul,div };
int input = 0;
int x;
int y;
do
{
mune();
printf("xuanze\n");
scanf("%d", &input);//选择算法
if (1 <= input && input<= 4)
{
printf("选择两位数");
scanf("%d%d", &x, &y);
int ret = parr[input](x, y);//调用指针
printf("%d", ret);
}
else if (input == 0)
printf("退出\n");
else
printf("错误\n");
} while (input);
return 0;
}
回调函数
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 mune()
{
printf("**********1add 2,sub*********\n");
printf("**********3mul 4,div*********\n");
printf("*********** 0exit *************\n");
}
void calc(int(*pf)(int, int))//调用函数地址(回调函数)
{
int x;
int y;
printf("请输入");
scanf("%d%d", &x, &y);
printf("%d", pf(x, y));
}
int main()
{
int input = 0;
int x;
int y;
do
{
mune();
printf("xuanze\n");
scanf("%d", &input);
switch (input)
{
case 1:
calc(add);//add函数地址
break;
case 2:
calc(sub);
break;
case 3:
calc(mul);
break;
case 4:
calc(div);
break;
default:
printf("输入错误");
break;
}
} while (input);
return 0;
}
指向函数数组的指针(理解)
int main()
{
int arr[10];
int(*p)[10] = &arr;//数组的地址
int (*pf)(int, int);//函数指针
int(*pfarr[4])(int, int);//函数指针的数组
int(*( * ppfarr) [4])(int, int) = &pfarr;//指向数组函数的指针
//函数指针的类型int (*)(int ,int)
}
qsort(冒泡排序)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct stu
{
char name[20];
int age;
};
int cmp_int(const void* e1,const void* e2)//空指针可以避免数据类型的问题。可以接受任意地址,void*不能通过解应用运算。
{
return (int)(*(int*)e1 - *(int*)e2);//可以改变类型值
}
int cmp_stu_name(const void* e1, const void* e2)//空指针可以避免数据类型的问题。可以接受任意地址,void*不能通过解应用运算。
{//名字比较就是比较字符串。不能用符号来表示//比较阿斯克码表(首个字母)
return strcmp(((stu*)e1)->name, ((stu*)e2)->name);
}
int main()
{
float arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_stu_name);//1排序的数组,2个数3,字符大小,运行函数//可以换函数
stu s[2] = { {"zhangsan",18},{"lisi",20} };
printf("%s ", s->name);
retuen 0;
}
qsort实现
void swap(char* buf1, char*buf2, int width)//交换字节
{
int i;
for (i = 0; i < width; i++)//字节个数
{
char tem = *buf1;
*buf1 = *buf2;
*buf2 = tem;
buf1++;
buf2++;
}
}
void sqotr(void* base, int sz, int width, int(*cmp)(void* e1, void* e2))
{
int i;
for (i = 0; i < sz; i++)//趟数
{
int j;
for (j = 0; j < sz - 1 - j; j++)//冒泡排序
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}