指针学习(五)

news/2025/3/16 6:37:18/

一.函数指针数组

定义:函数指针放进数组中,就叫函数指针数组,准确的说,将一个函数的地址存到⼀个数组中

那这个数组就叫函数指针数组。
int (*pi[5])(int);

解读:pi先和[]结合,因此是数组,加int (*   )(int)表示其是函数指针

重在理解!!!

例一:

实现计算器(转移表)

法一:(不用函数指针数组)

实现:加,减,乘,除,取余,左移,右移

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
void Menu()
{printf("***************************\n");printf("*****    0.quit    ********\n");printf("*****    1.Add     ********\n");printf("*****    2.Sub     ********\n");printf("*****    3.Mul     ********\n");printf("*****    4.Div     ********\n");printf("*****    5.Mod     ********\n");printf("*****    6.Lsh     ********\n");printf("*****    7.Rsh     ********\n");printf("***************************\n");
}
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;
}
int Mod(int x, int y)
{return x % y;
}
int Lsh(int x, int y)
{return x << y;
}
int Rsh(int x, int y)
{return x >> y;
}
int main()
{Menu();int x = 0;int y = 0;int input = 0;printf("请输入:\n");scanf("%d", &input);int ret = 0;do{switch (input){case 0:{printf("退出,欢迎下次使用\n");break;}case 1:{printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", Add(x, y));break;}case 2:{printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", Sub(x, y));break;}case 3:{printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", Mul(x, y));break;}case 4:{printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", Div(x, y));break;}case 5:{printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", Mod(x, y));break;}case 6:{printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", Lsh(x, y));break;}case 7:{printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", Rsh(x, y));break;}}} while (input);return 0;
}

法二:(利用函数指针数组)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
void Menu()
{printf("***************************\n");printf("*****    0.quit    ********\n");printf("*****    1.Add     ********\n");printf("*****    2.Sub     ********\n");printf("*****    3.Mul     ********\n");printf("*****    4.Div     ********\n");printf("*****    5.Mod     ********\n");printf("*****    6.Lsh     ********\n");printf("*****    7.Rsh     ********\n");printf("***************************\n");
}
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;
}
int Mod(int x, int y)
{return x % y;
}
int Lsh(int x, int y)
{return x << y;
}
int Rsh(int x, int y)
{return x >> y;
}
int main()
{Menu();int x = 0;int y = 0;int input = 0;int (*pi[8])(int x, int y) = { 0,Add ,Sub,Mul,Div,Mod,Lsh,Rsh};printf("请输入:\n");scanf("%d", &input);int ret = 0;if (0 == input){printf("退出,欢迎下次使用\n");}if (1 <= input && input <= 8){printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", (*pi[input])(x, y));}return 0;
}

结果:

二.回调函数.

把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应.本质上回调函数就是⼀个通过函数指针调⽤的函数

对例题一:

我们通过回调函数来实现它

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
void Menu()
{printf("***************************\n");printf("*****    0.quit    ********\n");printf("*****    1.Add     ********\n");printf("*****    2.Sub     ********\n");printf("*****    3.Mul     ********\n");printf("*****    4.Div     ********\n");printf("*****    5.Mod     ********\n");printf("*****    6.Lsh     ********\n");printf("*****    7.Rsh     ********\n");printf("***************************\n");
}
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;
}
int Mod(int x, int y)
{return x % y;
}
int Lsh(int x, int y)
{return x << y;
}
int Rsh(int x, int y)
{return x >> y;
}
void cala(int(*pi)(int , int ))
{int x = 0;int y = 0;printf("请输入:\n");scanf("%d %d", &x, &y);printf("%d\n", pi(x, y) );
}
int main()
{Menu();int x = 0;int y = 0;int input = 0;printf("请输入:\n");scanf("%d", &input);do{switch (input){case 0:{printf("退出,欢迎下次使用\n");break;}case 1:{cala(Add);break;}case 2:{cala(Sub);break;}case 3:{cala(Mul);break;}case 4:{cala(Div);break;}case 5:{cala(Mod);break;}case 6:{cala(Lsh);break;}case 7:{cala(Rsh);break;}}} while (input);return 0;
}

三.sqort函数

1.头文件为#include <stdlib.h>

2.里面有四个形参,表里介绍的很详细了

3.作用:其可以排序各种数据类型

我们先来实现其排序整型:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int compare(const void* a, const void* b)
{return (*(int*)a - *(int*)b);
}
int main()
{int arr[] = { 1,3,5,7,9,0,8,6,4,2 };qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]),compare);for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){printf("%d ", *(arr + i));}return 0;
}

结果:

排序结构体:

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct stduent
{char name[20];int age;double score;};
int compare1(const void* a, const void* b)
{return strcmp(((struct stduent*)a)->name, ((struct stduent*)b)->name);
}
int compare2(const void* a, const void* b)
{return (*(int*)a-*(int*)b);
}
int compare3(const void* a, const void* b)
{return (*(int*)a - *(int*)b);
}
void test1()
{struct stduent arr1[] = {{"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0}};qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare1);//比名字for (int i = 0; i < 3; i++){printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);}printf("结束\n");
}
void test2()
{struct stduent arr1[] = { {"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0} };qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare2);//比年龄for (int i = 0; i < 3; i++){printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);}printf("结束\n");
}
void test3()
{struct stduent arr1[] = { {"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0} };qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare1);//比成绩for (int i = 0; i < 3; i++){printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);}printf("结束\n");}
int main()
{test1();test2();test3();return 0;
}

结果:

实现sqort函数:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int compare(const void* a, const void* b){return (*((int*)a) - *((int*)b));}void swap(const void* x, const void* y, int size){for (int i = 0; i < size; i++){char temp = *((char*)x+i);*((char*)x + i) = *((char*)y + i);*((char*)y + i) = temp;}}void Bubble(void* arr, int count, int b, int compare(void*, void*)){for (int i = 0; i < count - 1; i++){for (int j = 0; j < count - 1 - i; j++){if (compare((char*)arr + j * b, (char*)arr + (j + 1) * b) > 0){swap((char*)arr + j * b, (char*)arr + (j + 1) * b, b);}}}}int main(){int arr[10] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz; i++){scanf("%d",arr+i);}Bubble(arr, sz, sizeof(arr[0]), compare);//输出for (int i = 0; i < sz; i++){printf("%d ", *(arr + i));}return 0;}

最后,祝福各位学习天天进步!!!


http://www.ppmy.cn/news/1233830.html

相关文章

错题集(c语言)

一、 #include <stdio.h> int main() {int x, y;for (x 30, y 0; x > 10, y<10; x--, y)x / 2, y 2;printf("x%d,y%d\n", x, y);return 0; }思路&#xff1a; 第一次循环开始前&#xff1a;x30&#xff0c;y0&#xff0c;结束&#xff1a;x15&#…

Bellman-Ford算法

初步了解 Bellman-Ford算法是一种用于寻找带有负权边的图中的单源最短路径的算法。它可以处理一般的图&#xff0c;包括存在负权边和负权环的情况。 以下是Bellman-Ford算法的基本思想和步骤&#xff1a; 初始化&#xff1a;将源节点的距离设置为0&#xff0c;将所有其他节点…

Linux:安装MySQL服务(非docker方式)

1、下载安装包 下载MySQL安装包&#xff0c;需要Oracle官网的账号 下面是网友提供的账号及密码&#xff0c;亲测有效。 账户&#xff1a;3028064308qq.com 我用的这个&#xff0c;可以登陆 密码&#xff1a;OraclePassword123!Oracle Account: 602205528qq.com Oracle Pass…

Redis+整合SpringDataRedis

Nosql和缓存的背景 数据库架构设计的发展史 第一阶段&#xff1a;单库&#xff1a;随着访问量的增加出现了性能问题 第二阶段&#xff1a;缓存&#xff1a;通过缓存&#xff0c;缓解数据库的压力&#xff0c;优化数据结构和索引 第三阶段&#xff1a;读写分离&#xff1a;数据…

【LeetCode刷题】--39.组合总和

39.组合总和 本题详解&#xff1a;回溯算法剪枝 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {int len candidates.length;List<List<Integer>> res new ArrayList<>();if (len 0) {return r…

服务器探针-serverstatus

{alert type"info"} 之前给大家介绍过一个简单的服务器监控。uptime-kuma 今天给各位带来一个酷炫的多服务器探针和多服务器监控。ServerStatus {/alert} 作者的开源项目地址如下&#xff1a;https://github.com/cppla/ServerStatus 作者的项目体验地址如下 https://…

C#编程题分享(3)

n的阶乘问题 输⼊整数n&#xff0c;输出n的阶乘。 int n Convert.ToInt32(Console.ReadLine()); int jiecheng 1; for (int i 1; i < n 1; i) {jiecheng * i; // 1 * 2 * 3 * .....} Console.WriteLine("{0}的阶乘是&#xff1a;{1}", n, jiecheng); q^n次…

云计算时代改变了什么?

当今云计算时代&#xff0c;计算资源和数据存储已经不再受限于本地设备的硬件和软件限制。云计算技术的发展和普及&#xff0c;使得用户可以通过互联网访问大量的计算资源和存储空间&#xff0c;从而改变了我们对计算和数据的看法。本文将探讨云计算时代对计算和数据处理的影响…