【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

相关文章

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示