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

2024-03-08 00:20
文章标签 语言 指针 前篇

本文主要是介绍【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;
}

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

这篇关于【C语言】终の指针(前篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785325

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ