【C语言】终の指针(前篇)


在这里插入图片描述
个人主页点这里~

指针初阶点这里~

指针初阶2.0点这里~

指针进阶点这里~


终の指针

  • 一、回调函数
  • 二、qsort函数
    • 1、整形比较
    • 2、结构数据比较
      • ①结构体
      • ②`->` 的使用
      • ③结构数据比较

一、回调函数

回调函数就是⼀个通过函数指针调用的函数。
把一个函数的指针作为参数传递给另一个函数,当这个指针被调用其所指向的函数时,被调用的函数就是回调函数
简单的说就是函数套函数,还是指针的用法,把相似的代码抽象成函数
在上一篇博文指针进阶中讲到的计算器程序,可以被简化

指针进阶点这里~
这里我们复制一下上一篇博文的代码

#include <stdio.h>
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("**************************************************\n");
	printf("********  1.add         2.sub  *******************\n");
	printf("********  3.mul         4.div  *******************\n");
	printf("****************  0.exit  ************************\n");
	printf("**************************************************\n");
}
//打印一个菜单函数
int main()
{
	int x = 0;
	int y = 0;
	int input = 1;
	int(*p[5])(int x,int y) = {NULL,add,sub,mul,div};
	//首位放NULL,那么可以从1开始访问函数指针,当然也可以不放,但这么放更好,可以继续往下看,看看为什么这么放更好
	menu();
	do
	{
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入->");
			scanf("%d %d", &x, &y);
			printf("%d\n", (*p[input])(x, y));
			//这里input就不会为零,whlie也会继续运行,我们写代码时要考虑上下不干扰的一致性
		}
		else if (input == 0)
		{
			printf("退出\n");
		}
		else
		{
			printf("请重新输入\n");
		}

	} while (input);
	return 0;
}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/s_little_monster/article/details/136422391
#include <stdio.h>
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("**************************************************\n");
	printf("********  1.add         2.sub  *******************\n");
	printf("********  3.mul         4.div  *******************\n");
	printf("****************  0.exit  ************************\n");
	printf("**************************************************\n");
}
//到这里以上都是相同的
void func(int (*pf)(int, int))
{
	int ret = 0;
	int x, y;
	printf("请输入:");
	scanf("%d %d", &x, &y);
	printf("结果为:%d\n", pf(x, y));
}
//这里给了一个函数,函数的参数是一个函数指针,通过函数指针来调用函数,这就是回调函数
int main()
{
	int input = 1;
	do
	{
		menu();
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				func(add);
				break;
			case 2:
				func(sub);
				break;
			case 3:
				func(mul);
				break;
			case 4:
				func(div);
				break;
			case 0:
				printf("退出程序\n");
				break;
			default:
				printf("请重新输入:\n");
				break;
		}
//这里我们换成switch函数,便于理解回调函数
	} while (input);
	return 0;
}

二、qsort函数

qsort函数是一个快速排序函数
头文件为

#include <stdlib.h>

1、整形比较

这里我们想要完成一个升序。
1、qsort第一个变量为数组首元素地址
2、qsort第二个变量为数组长度
3、qsort第三个变量为数据类型的长度
4、创建一个函数,参数为数组指针,将相邻的两个元素相减,返回一个值到qsort的第四个参数上,为一个区分正负零的数字 ,前边的数字减后边(序号小减序号大)的数字为升序,反之则为降序

#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}
int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int i = 0;

	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

2、结构数据比较

①结构体

我们描述一个学生,我们用四个内容:

struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
};

```c
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s1;//这里不要忘记分号;s1这也是一种定义
struct Stu s2;//定义结构体变量
struct Stu s3 = { "zhangsan",18,"man","1234567" };//初始化
struct Stu s4 = {.id="1234568",.age=19,.sex="woman",.name="lisi"};//按自己想要的顺序初始化
struct Node
{
 int data;
 struct Stu s5;
 struct Node* next;
}n1 = { 10, {"zhaowu",20,"man","1234569"}, NULL };//结构体嵌套初始化

-> 的使用

int main()
{
	struct Data
	{
		int a, b, c;
	};
	struct Data* p;
	struct Data A = { 1,2,3 };
	int x;
	p = &A;
	x = p->a;
	printf("%d", x);
}

取出p所指向的结构体中包含的数据项a赋值给x

③结构数据比较

struct Stu 
{
	char name[20];
	int age;
};
//1、按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//2、按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的
//3、按照年龄来排序
void test2()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//4、按照名字来排序
void test3()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
	test2();
	test3();
	return 0;
}

今日分享完毕,谢谢收看
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/437611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测

分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测 目录 分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测。基于灰狼算法(GWO…

和为K的子数组

题目&#xff1a; 使用前缀和的方法可以解决这个问题&#xff0c;因为我们需要找到和为k的连续子数组的个数。通过计算前缀和&#xff0c;我们可以将问题转化为求解两个前缀和之差等于k的情况。 假设数组的前缀和数组为prefixSum&#xff0c;其中prefixSum[i]表示从数组起始位…

仓储管理系统(WMS) 的研发历程-PRD撰写

题外话&#xff1a;PRD的展现形式有多种&#xff0c;有的人喜欢在axure上直接做产品描述&#xff0c;觉得word较为过时&#xff0c;有的人认为axure不专业&#xff0c;任何展现形式都无可厚非&#xff0c;重要的达到PRD的目的&#xff0c;PRD的目标是让团队知道需求实现细节&am…

Vue中如何处理用户权限?

在前端开发中&#xff0c;处理用户权限是非常重要的一个方面。Vue作为一种流行的前端框架&#xff0c;提供了很多便捷的方式来管理用户权限。本文将介绍一些Vue中处理用户权限的方法 1. 使用路由守卫 Vue Router提供了一个功能强大的功能&#xff0c;即导航守卫&#xff08;N…

18-Java迭代器模式 ( Iterator Pattern )

Java迭代器模式 摘要实现范例 迭代器模式&#xff08;Iterator Pattern&#xff09;用于顺序访问集合对象的元素&#xff0c;不需要知道集合对象的底层表示 迭代器模式是 Java 和 .Net 编程环境中非常常用的设计模式 迭代器模式属于行为型模式 摘要 1. 意图 提供一种方法…

【LeetCode:2917. 找出数组中的 K-or 值 + 模拟+位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

国内鞋服品牌如何打造出优衣库的“零库存”运营体系

优衣库&#xff0c;作为全球知名的服装品牌&#xff0c;以其独特的“零库存”运营体系在业界树立了标杆。对于国内鞋服品牌而言&#xff0c;如何借鉴并打造类似的“零库存”运营体系&#xff0c;不仅是提升竞争力的关键&#xff0c;也是实现可持续发展的必然选择。本文将探讨国…

springboot实现多线程开发(使用@Async注解,简单易上手)

根据springboot的核心思想便捷开发&#xff0c;使用多线程也变得简单起来&#xff0c;通过一下几个步骤即可实现。 核心注解 EnableAsync将此注解加在启动类上&#xff0c;使项目支持多线程。 Async 使用我们的Async注解在所需要进行多线程的类上即可实现。 配置线程池 …

2024/3/7—2575. 找出字符串的可整除数组

代码实现&#xff1a; int* divisibilityArray(char *word, int m, int *returnSize) {int n strlen(word);int *res (int*)malloc(sizeof(int) * n);long cur 0;for (int i 0; i < n; i) {cur (cur * 10 (word[i] - 0)) % m;res[i] (cur 0) ? 1 : 0;}*returnSize …

1.BOM-获取元素(获取元素、修改属性)

web Api基本认知 作用&#xff1a;通过JS去操作html页面和浏览器(实现浏览器中的某些功能) 分类&#xff1a; DOM(网页)&#xff1a;Document Object Model(文档对象模型) BOM(浏览器)&#xff1a;Borwser Object Model(浏览器对象模型) DOM DOM树 将网页中标签的关系以树状…

[c++] c++ 中的顺序(构造,析构,初始化列表,继承)

对象构造的时候&#xff0c;对象成员变量的初始化顺序是什么样的 &#xff1f; 派生类构造的时候&#xff0c;先构造基类还是先构造派生类 &#xff1f; 构造函数中的初始化列表&#xff0c;初始化的顺序是列表的顺序吗 &#xff1f; 析构的时候&#xff0c;析构的顺序是什么…

评估需求优先级的方法

Kano模型&#xff1a; 1.前言 在大量的需求需要进行迭代时&#xff0c;由于时间、人力、财力等相关因素干扰&#xff0c;无法在有限的时间内容对所有的需求进行满足&#xff0c;此时需要我们对需求进行优先级的排列。最大化的合理的提高有限资源的使用。 在常见的产品优先级…

vcomp140.dll丢失如何修复,5种修复方法轻松搞定vcomp140.dll问题

vcomp140.dll文件的丢失可能会引发一系列系统运行与软件功能上的问题。具体来说&#xff0c;这个动态链接库文件是Visual C Redistributable的一部分&#xff0c;对于许多基于此环境开发的应用程序至关重要。一旦缺失&#xff0c;可能会导致部分应用程序无法正常启动或运行&…

代码随想录训练营第39天 | LeetCode 62.不同路径、​​​​​​LeetCode 63. 不同路径 II

LeetCode 62.不同路径 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili 思路 代码如下&#xff1a; ​​​​​​LeetCode 63. 不同路径 II 文章讲解…

Java定时调度

在Java应用程序中&#xff0c;定时调度是一项重要的任务。它允许你安排代码执行的时间&#xff0c;以便在将来的某个时刻自动执行任务。Java提供了多种方式来实现定时调度&#xff0c;其中最常用的是Java的Timer和ScheduledExecutorService。 在本教程中&#xff0c;我们将学习…

基于C/S架构的在线阅读器

项目简介 本项目实现了用户的基本阅读功能。项目内容涉及到IO&#xff0c;网络编程&#xff0c;C&#xff0c;QT等知识点。本次项目服务器搭建在ubuntu上&#xff0c;客户端ui在QT中实现&#xff0c;客户端和服务器使用套接字通信。 一、基本功能展示 &#xff08;1&#xff…

开发利器——C语言必备实用第三方库

​ 对于广大C语言开发者来说&#xff0c;缺乏类似C STL和Boost的库会让开发受制于基础库的匮乏&#xff0c;也因此导致了开发效率的骤降。这也使得例如libevent这类事件库&#xff08;基础组件库&#xff09;一时间大红大紫。 今天&#xff0c;码哥给大家带来一款基础库&#…

【开源物联网平台】FastBee认证方式和MQTT主题设计

&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 设备认证 1.2 设备交…

思维题(蓝桥杯 填空题 C++)

目录 题目一&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码七&#xff1a; 题目八&#x…

Unity Samples和帧动画的问题

拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy&#xff0c;然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因&#xff0c;而且Unity把Samples这个…