qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数

DCM、PLL以及DLL等概念及详情 介绍DLL、PLL以及DCM的概念,总结其模块构成、工作原理、相互之间的差异与各自优势。 阅读详情

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.qsort函数

1.1qsort函数的参数

1.2利用qsort函数排序整形数据

1.3利用qsort函数排序结构体数据

2.模拟实现qsort函数

2.1冒泡排序

2.2代码实现


         今天主要给大家带来的是对于qsort函数的详细讲解以及使用冒泡排序模拟实现qsort函数,我们这里包括qsort函数的参数的理解和使用针对数组结构体进行升序降序排序,模拟qsort函数的参数。

1.qsort函数

1.1qsort函数的参数

        对于qsort函数,我相信大家大部分还是第一次见到这个函数,我们先进入网站cplusplus

 返回旧版,查找qsort函数

 我们看到qsort函数的头文件是stdlib.h,我们可以发现qsort函数具定义为

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

 

        在这里base是指我们要传入的数组 ,num是指传入数组的元素个数,size是指数组一个元素的所占的字节数,int (*compar)(const void*,const void*)是一个函数指针,在这里需要我们建立一个函数

         这个函数指针的参数是void*类型,因为qsort函数可以排序任意类型的数据,使用时强制转换就可以使用。

1.2利用qsort函数排序整形数据

#include<stdio.h>
#include <stdlib.h>
int comper(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[5] = { 0,2,1,4,3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

我们运行后可以得到

为升序排序,我们想要改为降序排序只需要将我们的comper函数进行修改

int comper(const void* e1, const void* e2)
{
	return  *(int*)e2- *(int*)e1 ;
}

运行后为降序排序。

1.3利用qsort函数排序结构体数据

#include<stdio.h>
#include <stdlib.h>
typedef struct student
{
	int age;
	char num[20];
}stu;
int comper(const void* e1, const void* e2)
{
	return ((stu*)e1)->age - ((stu*)e2)->age;
}
int main()
{
	stu arr[3] = { 20,"zhangsan",19,"libai",22,"aiqiyi" };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i].age );
	}
	return 0;
}

在进行比较名字是我们需要用到strcmp函数具体代码如下

int comper(const void* e1, const void* e2)
{
	return strcmp(((stu*)e1)->num , ((stu*)e2)->num);
}

2.模拟实现qsort函数

        我们前面讲过想对数据进行排序可以使用冒泡排序,但是冒泡排序却有一些局限性,我们在这里利用冒泡排序来模拟实现qsort函数。

2.1冒泡排序

  对于冒泡排序我们主要的代码为

void bulubulu(int arr[],int sz)
{
	int i, j,temp;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

在这里我们主要就是依靠冒泡排序进行实现。

2.2代码实现

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int comper(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void swap(char *p,char*q,size_t sz)
{
	int i;
	char temp;
	for (i = 0; i < sz; i++)
	{
		temp = *p;
		*p = *q;
		*q = temp;
		p++;
		q++;
	}
}
void bulubulu(void *base,size_t sz,size_t size)
{
	int i, j;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (comper((char*)base + j * size, (char*)base + (j + 1) * size)>0)
			{
				swap((char*)base+j*size,(char*)base+(j+1)*size,sz);
			}
		}
	}
}

void my_qsort(void *base,size_t num,size_t size,int(*comper)(const void *e1,const void *e2))
{
	bulubulu(base, num, size);
}
int main()
{
	int arr[5] = { 0,2,1,5,3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
		printf("%d ", arr[i]);

}

        在这里,我们想排序一个整型数组,我们先得到数组有几个元素,每个元素占用几个字节,在我怕们的my_qsort函数中采用void*base是因为我们不知道要排序的元素是什么类型,我们进入冒泡排序也就是bulubulu函数中,在这里最为关键的是if (comper((char*)base + j * size, (char*)base + (j + 1) * size)>0)和swap((char*)base+j*size,(char*)base+(j+1)*size,sz)这两句,由于我们不知道想要排序的是什么类型,base是void*类型,想要使用swap函数和comper函数需要我们传送地址,我们将base强制转换为char*类型,我们还有一个元素占用的字节数size,再根据是第几个元素得到它的地址,在swap中我们是一个字节一个字节的进行交换。在这里comper是我们用户自己写的,其余的只需要my_qsort就可以解决。

今天的内容就结束了,希望大家可以学到很多东西。

MDK5 Debug调试方法总结 阅读详情

相关推荐

海思ISP实战:YUV Sharpen参数调试全解析

本文深入解析了在海思ISP平台上进行YUV Sharpen参数调试的实战经验。文章以海思3516EV300芯片为例,详细拆解了EdgeFiltStr、TextureFreq等核心参数的作用与协同策略,并重点阐述了如何通过ISO联动调试,在图像清晰度与噪声抑制之间取得最佳平衡,为图像调试工程师提供了宝贵的避坑指南和实战参考。

grape的博客 209

qsort函数-详细讲解及冒泡排序模拟_qsort函数冒泡函数

首先数据在内存中是以字节存储的,1个int类型占4个字节,并且在vs编译器中是以小端字节序存储,如果不知道小端字节序存储可以查看下我发的一篇大小端字节序存储了解下。比较函数中第一个减第二个元素默认升序排序,若需降序只用把两个元素交换位置,用第二个元素减第一个元素,qsort函数中自带的有交换函数,我们只需要创建比较函数。的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进。在交换函数swap中利用width实现将数据的每一个字节进行交换,达成交换数据的目的。

2501_90225546的博客 760

Oracle ERP EBS R12 GL总帐业务方案 系统操作

本文档是Oracle ERP系统的总账管理模块使用手册,主要包含以下内容:1.系统架构设计,详细介绍多组织架构、会计科目设置等核心概念;2.总账日常操作流程,包括凭证录入、审核、过账等全流程管理;3.特殊业务处理,涵盖预算控制、内部往来、合并报表等专项功能;4.期末处理,说明月结、年结的操作步骤;5.系统设置指南,提供会计科目表、权限控制等配置说明;6.附录包含各业务模块的分录示例和系统操作图标说明。本手册适用于财务人员学习和使用Oracle ERP总账系统,重点讲解系统功能要点和实操步骤。

anpeng2019的博客 1888

基于qsort模拟实现冒泡排序

本文通过冒泡排序模拟实现C语言中的qsort通用排序函数,展示了如何利用char*指针和函数指针实现类型无关的排序操作。核心思路包括:1) 将数据转换为字节指针实现内存操作;2) 通过自定义比较函数支持不同数据类型。作者提供了完整代码实现,包括整型和结构体排序示例,并分析了算法复杂度(O(n²)时间复杂度,O(1)空间复杂度)。虽然性能不如标准库的快速排序,但这种方法有助于深入理解指针、内存操作和通用函数设计原理。文章还提出了使用memcpy优化交换效率和改用快排算法的改进建议。

2301_80228652的博客 686

HDMI接口协议

接口HDMI(High-Definition Multimedia Interface),新一代多媒体接口标准。即高清多媒体接口。它能够同时传输视频和音频,简化了设备的接口和连线;同时提供了更高的数据传输带宽,可以传输无压缩的数字音频及高分辨率视频信号。HDMI 1.0 版本于 2002 年发布,最高数据传输速度为 5Gbps;而2017 年发布的 HDMI 2.1 标准的理论带宽可达 48Gbps。1、能够同时传输视频和音频,简化了设备接口与连线。2、提供了更高的数据传输带宽,

weixin_42581439的博客 2594

Wordpress实战之第二章安装wordpress 软件需要的软件

使用下载并安装phpstudy面版工具 wget -O install.sh?https://notdocker.xp.cn/install.sh?&& sudo bash install.sh 2.安装成功如下 ==============运行状态========================= webpanel stop phpstudy running =================...

安全参透之旅 612

模拟实现qsort函数的冒泡序列

qsort函数是一种可以对任意类型的数据进行排序的函数,它的定义在<stdlib.h>这个函数一共有四个参数,它们分别是:1.base:指向待排序数组的第一个元素的指针。2.num:数组中元素的个数。可以使用sizeof(arr)/sizeof(arr[0])来求出元素个数。3.size:每个元素的大小(以字节为单位)。可以使用sizeof(类型)求出,例如sizeof(int)。compar。

cpp_player258的博客 723

Plecs电力电子仿真专业教程-第一季 第一节 Plecs简介

Plces 电力电子仿真专业教程系列依托专业的电力电子仿真软件Plecs对各种电力电子常用的拓扑及实际设计的方案进行系统及仿真与软件代码仿真实践。通过对各种电路仿真原理的讲解及专业C语言代码程序的编写,提升学员的系统设计能力,软件编程能力与理论分析能力。

3644

「C 语言指针进阶」回调函数精讲:从概念到实战(含 qsort 使用 + 模拟实现)

本文通过回调函数和冒泡排序实现了类似qsort的通用排序功能。主要内容包括:1)回调函数的概念,通过函数指针调用函数;2)冒泡排序算法原理,通过相邻元素比较交换位置;3)自定义my_qsort函数实现,使用void*指针处理任意数据类型,配合cmp比较函数和my_swap交换函数完成排序。关键点在于利用size参数控制指针移动,以及通过函数指针实现灵活的排序规则。该实现展示了如何结合回调机制和基础算法构建通用工具函数。

2301_81618192的博客 891

RDkit入门

今天开始写RDkit的入门教程,每天学习和写一小点,相信一句话“不积跬步无以至千里,不积小流无以成江海”,所以就慢慢来,一点一滴积累叭,从最简单的开始喽希望自己每天都能保持写博客的好习惯,把自己的代码笔记就极在这里,RDkit一块啃了很久的骨头,今天终于要下定决心,好好总结一波了,希望保持这个更新的频率,每天都能有所学。............

博客而已 6683

logisim中,如何设计一个位于十字路口的交通信号灯控制系统?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1345

C:qsort的模拟实现(2) --(超详解)

因为qsort函数是对任意类型的数据排序,那么我就需要有一个函数来实现使用者想要排序的数据类型,就像一个接口一样,使用者想排序整形,我们使用者就自已写一个比较整形两个数的逻辑,我们想比较字符型,使用者就自已写一个比较字符类型两个字符比较的逻辑,所以在比较。因为我们是对任意数据排序,所以怎么判断两个数的大小,以及需要交换这两个数,怎么交换,我们在接受这个数组时,又该又什么样的指针,现在,我们一一来解决,其实很简单,不用害怕。我们就arr[j]和arr[j+1]传过去,因为只想比较,不想改变,所以我用。

2401_83251330的博客 803

2026年华为od机试真题题库

OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)

面试高手的博客 19万+

C语言入门知识点(12.回调函数与qsort函数的模拟与实现)

本文介绍了C语言中的回调函数和qsort函数的应用。首先通过简化计算器代码的案例,展示了回调函数如何通过函数指针实现不同功能的选择调用。接着详细解析了qsort函数的标准规范和使用方法,包括其参数含义和比较函数的设计要点。文章还通过模拟qsort功能的冒泡排序实现,帮助读者深入理解指针在函数回调中的应用。该内容适合希望提升C语言指针和函数式编程理解的初学者,提供了从基础概念到实际应用的完整学习路径。

分享 AI 时代程序员的进阶之路:大模型应用、AI 编程工具实战,同时沉淀 C / Linux 底层技术笔记。与君共赴,万里征途。 1373

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

qsort使用和模拟实现

qsort用冒泡排序算法的模拟实现

orororororo的博客 170

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C语言-深入理解指针(4)

本章内容我们主要来探讨回调函数与qsort函数以及如何利用传统排序模拟实现qsort函数的相关内容。内容丰富,大家听我娓娓道来~

Become Mad的博客 972

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C语言第17讲

对比函数 两指针指向的整个结构体,需要细化至结构体中的name使用((struct stu*)p1)后加 ->name在使用->时格式:指针 -> 成员名在使用 . 时格式:结构体变量名称 . 成员名。

2503_93021656的博客 1325

指针讲解(4)

本文介绍了回调函数的概念及其应用。回调函数是通过函数指针调用的函数,其本质是将函数作为参数传递并在特定条件下执行,文中通过计算器示例展示了回调函数如何简化重复代码。同时详细讲解了qsort库函数的使用方法,包括其参数说明和具体应用示例,最后演示了用冒泡排序模拟实现qsort功能的过程。这些内容展示了函数指针在编程中的灵活应用,既能优化代码结构,又能实现通用性强的功能。

2302_81017491的博客 765

深入理解指针之冒泡排序和快速排序

本文介绍了C语言中回调函数的概念及其在排序算法中的应用。通过冒泡排序示例,展示了基本排序原理及其优化方法。重点讲解了qsort函数的四个参数及其实现逻辑,包括对整型数组和结构体的排序应用。文章还演示了如何用冒泡排序模拟实现qsort函数,详细说明了指针转换、比较函数编写和元素交换等关键技术点。这些内容深入浅出地阐述了指针操作和函数调用的核心概念,为理解回调函数机制提供了实践案例,有助于提升编程能力和对C语言指针的理解深度。

Ycs66666666的博客 1021

回调函数及qsort应用实例&&使用回调函数模拟实现冒泡排序

回调函数及qsort应用实例&&使用回调函数模拟实现冒泡排序

weixin_50601177的博客 230

系统性学习C语言-第十五讲-深入理解指针(5)

你所见过的最全面,最详细讲解C语言知识点的文章,第十四讲-深入理解指针(4)

2401_87023016的博客 813

【C语言】函数指针|函数指针数组|函数指针数组指针|如何理解?

【C语言】函数指针|函数指针数组|函数指针数组指针|如何理解?函数指针实现简易计算器|库函数qsort|使用sqort函数对结构体变量的成员排序|模拟qsort实现冒泡排序|泛型指针|结构体数组

m0_64538862的博客 2899

C语言重点突破(2)指针(三)

首先可以明确的是,函数指针和数组指针的类型都是指针类型,用来存放地址的,数组指针存放数组的地址,而函数指针存放的便是函数的地址。我们来看看函数指针是如何定义的答案是:pfun1,首先*先与pfun1结合,说明它是一个指针,之后再与()结合形成指向函数的指针,返回类型是void。2. 函数指针数组前面我们已经学过指针数组,它是一个存放指针变量的数组,而函数指针数组就是存放函数指针的数组。下面来看看它是如何定义的。

wcl312的博客 302

c语言指针详解(5)

本文介绍了回调函数的概念及其在C语言中的应用。文章还通过计算器程序的改造示例,展示了使用回调函数优化代码结构的方法。

2201_75600170的博客 588

C语言基础知识:指针(5)

qsort函数

T_L_the_language的博客 1053

深入理解指针3

因为红色框中的代码,只有调用函数的逻辑是有差异的,我们可以把调用的函数的地址以参数的形式传递过去,使用函数指针接收,函数指针指向什么函数就调用什么函数,这里其实使用的就是回调函数的功能。这里我们在Cal函数的参数设为函数指针,在函数内通过函数地址来调用函数,而被函数指针调用的函数就是回调函数,不同于使用函数指针数组通过下标调用数组元素中的函数地址,是不同的函数调用形式。我们写的计算器实现的代码中,红色框中的代码是重复出现的,其中虽然执行计算的逻辑是区别的,但是输入输出操作是冗余的,有没有办法,简化一些呢?

2501_91369424的博客 1009
上一篇: C/C++指针进阶全(保姆级教学)
下一篇: C/C++指针和数组笔试题解析
steventom
博客等级 码龄4年 720粉丝 80原创
评论 30
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steventom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值