【C语言】指针(4)

一、回顾

 在这之前,我们学习了很多关于指针的内容,我们先在这里简单的回顾一下。

1、一级指针

int* p;    -- 整形指针-指向整形的指针 

char* p; ...

void* p;...

...

2、二级指针

int** p; 

char** p;

...

3、数组指针 -- 指向数组的指针

int (*p)[ ];

int main(){
	int arr[3] = {1,2,3};
	int (*parr)[3] = &arr;
return 0;
}

4、指针数组 -- 存放指针的数组,本质就是数组。

 int* arr[ ];

int main(){
	int a[] = {1,2,3,4,5};
	int b[] = {2,3,4,5,6};
	int c[] = {3,4,5,6,7};
	int* arr[] = {a,b,c};
	for(int i=0;i<3;i++){
		for(int j=0;j<5;j++){
			printf("%d ",*(arr[i] + j));
		}
    	printf("\n");
	}
	return 0;
}

二、函数指针

 1、理解

指向函数地址的指针

 2、写法

 函数返回类型 (* p)(参数1、参数2、...)

 3、举例

int Add(int x,int y){
	return x + y;
}
int main(){
	int (*p)(int ,int ) = &Add;
	printf("%p\n",&Add);
	printf("%p\n",Add);
	return 0;
}

 在前面一节中将到了  数组名和&数组名的区别、但在这里 函数名 == &函数名。

4、使用

由于 函数名 ==  &函数名。所以可以有多种调用方法。

int Add(int x,int y){
	return x + y;
}
int main(){
	int (*p)(int ,int ) = &Add;
	int ret = (*p)(20,6);
//	int ret = p(20,6);
//	int ret = Add(20,6);
	printf("%d\n",ret);
	return 0;
}

5、试解析下列的一段代码

(*(void ( * ) () ) 0 ) ( ) ;

e832363829ad4b49a9e45762ba6e2e02.png

三、函数指针数组

1、理解

存放函数指针的数组、存放同类型的函数指针。

 2、写法

  函数返回类型 (* pArr [ ])(参数1、参数2、...)

 3、举例  --  简单计算器的实现

void menu(){
	printf("***********************\n");
	printf("*****1、Add    2、Sub**\n");
	printf("*****3、Mul    4、Div**\n");
	printf("*****    0、exit     **\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 main(){
	int input = 0;
	do{
		int x = 0, y = 0, ret = 0;
		int (*parr[5])(int, int) = {NULL,Add,Sub,Mul,Div};
		menu();
		printf("请选择要实现的功能:");
		scanf("%d",&input);
		if(input >= 1 && input <=4){
			printf("请输入两个操作数:");
			scanf("%d %d",&x , &y);
			ret = (*parr[input])(x,y);
			printf("ret=%d\n",ret);
		}else if(input == 0){
			printf("退出程序\n");
			break;
		}else{
			printf("输入错误,重新输入\n");
		}
		
	}while(input);
	
	return 0;
}

4、* 指向函数指针数组的指针

void test(const char* str ){
	printf("%s\n",str);
}
int main(){
	void (*p)(const char*) = test; //函数指针p
	void (*parr[2])(const char*) = { test , NULL}; //函数指针数组parr
	void (*(*p3)[2])(const char*) = &parr;// 指向函数指针数组的指针
	return 0;
}

四、回调函数

1、概念理解

通过函数指针调用的函数。 ---  把一个函数的地址(指针)作为参数传递给另一个函数,当这个指针被用来调用其所指的函数时,就称它为回调函数。

 2、举例说明 --  库函数 qsort 的使用

#include<stdio.h>
#include <stdlib.h>   // qsort头文件
// qsort 函数
//  void qsort (void* base, //指向待排序的首元素地址。
//			size_t num,     //待排序的元素个数
//			size_t size,	//待排序元素的大小,单位时字节
//			int (*compar)(const void*,const void*)); //待排序元素的比较方式

int compare (const void * a, const void * b)
{
	return ( *(int*)a - *(int*)b );
}
int main ()
{
	int arr[] = {14,78,24,69,10};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort (arr, sz, sizeof(arr[0]), compare);
	for (int i=0; i<sz ; i++)
		printf ("%d ",arr[i]);
	return 0;
}

 3、举例 --  模拟qsort实现冒泡排序升级版

#include<stdio.h>
//   函数实现
void swap(char* a , char* b , int size){
	for(int i=0;i<size;i++){
		char tmp = *a;
		*a = *b;
		*b = tmp;
		a++;
		b++;
	}
}
void bubblePP(void* base,  //指向待排序的首元素地址
			int num,       //待排序的元素个数
			int size,      //待排序元素的大小,单位是字节
			int (*compar)(const void* ,const void* )){  //待排序元素的比较方式 
	for(int i=0;i<num ;i++){
		for(int j=0;j<num - i - 1;j++){
			if(compar((char*)base +j*size , (char*)base + (j+1)*size) > 0){
				swap((char*)base +j*size , (char*)base + (j+1)*size , size);
			}
		}
	}
}

//  用户输入
int compar (const void * a, const void * b)
{
	return ( *(int*)a - *(int*)b );
}

void print(int arr[], int sz){
	for(int i=0;i<sz;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
}
void test1(){
	int arr[] = {14,78,24,69,10};
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);                          //排序之前打印
	bubblePP(arr,sz,sizeof(arr[0]),compar);  // 排序
	print(arr, sz);                          //排序之后打印
}
//void test2(){
//	char arr[] = {'w','m','z','d'};
//		int sz = sizeof(arr) / sizeof(arr[0]);
//		print(arr, sz);  // 要使 compar 和 print 的类型参数与这里的相对应
//		bubblePP(arr,sz,sizeof(arr[0]),compar);  // 排序
//		print(arr, sz);
//}
int main(){
	test1();
//	test2();
	return 0;
}

要点分析:

在函数内部,并不知道用户传递给我们的数据类型,所以根据最小的char类型以及待排序的元素大小size,来确定下一个元素的位置。

 这里依然是和上面一样的问题,所以在swap交换的时候采用一字节一字节的交换方式,并以元素大小size为限制表示一个元素是否交换完成。​​​​​​

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

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

相关文章

采用_findfirst和_findnext获取当前文件夹下以及子文件夹下特定文件

1.相关知识点&#xff1a; 在实现此功能&#xff0c;主要使用到的函数包含&#xff0c;_findfirst()、_findnext()、_findclose()。通过使用上述函数以及配合结构体 _finddata_t 来达到一个遍历的效果。 _finddata_t的结构体信息 struct _finddata64i32_t {unsigned attrib…

Linux.小技巧快捷键

1. ctrl c 强制停止 终止某些程序的运行 也可以取消某行命令 2. ctrl d 退出或登出 进入python环境中&#xff0c;使用ctrl d 退出 3.history 查看历史使用了哪些命令 4. ! 历史最近使用的命令的开头 5.使用ctrl r 搜索历史使用的命令 按下 ctrl r 会进入 reverse -…

course-nlp——5-nn-imdb

本文参考自https://github.com/fastai/course-nlp。这部分是fastai1.0版本的教程&#xff0c;由于现在fastai2.0重构的改变非常大&#xff0c;所以文中的很多api都变了&#xff0c;由于学习目的并不是熟练掌握fastai&#xff0c;因此这里就简单的存一下&#xff0c;本文是用IMD…

2024-04-27 - AI for everyone - 第三周 - 吴恩达

摘要 2024-05-01 周三 杭州 阴 小记: (☆-v-) 2024-05-03 周四 杭州 🌤 小记: 这几天地铁好拥挤呀!不过体重已经减了 2 公斤 ,咔咔咔,继续坚持 2024-05-04 周四 杭州 🐟 小记: 因为在意,所以昨天有些事情超级不开心,但是我决定要彻底舍弃了,羁绊这种东西本就可…

探索数据结构:堆,计数,桶,基数排序的分析与模拟实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 堆排序 1.1. 算法思想 堆排序(Heap Sort)是一种基于堆数据结构的排…

R语言绘图 | 双Y轴截断图

教程原文&#xff1a;双Y轴截断图绘制教程 本期教程 本期教程&#xff0c;我们提供的原文的译文&#xff0c;若有需求请回复关键词&#xff1a;20240529 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组…

【kubernetes】探索k8s集群安全机制

目录 一、认证&#xff08;Authentication&#xff09; 1.1三种认证方式 1.2需要被认证的访问类型&#xff1a; 1.3安全性说明&#xff1a; 1.4证书颁发&#xff1a; 1.5kubeconfig 1.6Service Account 1.7Secret 与 SA 的关系 1.7.1Kubernetes 设计了一种资源对象叫做…

CSS 前端面试题学习笔记2

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“前端CSS面试题-2”。 一、主要题目 1.画一条0.5px的直线 注意&#xff1a;浏览器默认最小像素单位为1px &#xff0c;小于1px的自动默认为1px。如果给0.5px,那么浏览器会直接显示为1px&#xff0c;只有通过sca…

ARM功耗管理架构演进及变迁

安全之安全(security)博客目录导读 目录 一、功耗管理架构演进及变迁概述 二、多核 三、big.LITTLE 四、DynamIQ 五、ARM-V9 DynamIQ 思考:从单核->多核->big.LITTLE->DynamIQ,功耗管理架构演进? 一、功耗管理架构演进及变迁概述 二、多核

基于jeecgboot-vue3的Flowable流程-待办任务(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、ToDo.data.ts的数据信息如下 import {BasicColumn} from //components/Table; import {FormSchema} from //components/Table; import { rules} from //utils/helper/validator; impor…

vscode ctrl+鼠标左键无法跳转

打开设置&#xff0c;搜索intel…… 将这个智能感知改成default就可以了&#xff0c;我之前是在disable处。 分析了一下&#xff0c;其实跳转功能主要是根据上下文语法分析来实现的&#xff0c;并不是简单得全文匹配&#xff0c;因此需要相关得语法分析工具。 那么为什么默认式…

源码文章上传无忧,论坛小程序支持

前言 在数字化时代&#xff0c;知识的分享与传播显得愈发重要。为了满足广大创作者和求知者的需求&#xff0c;我们推出了全新的论坛小程序&#xff0c;不仅支持文章、源码、链接等多样化内容的上传&#xff0c;还实现了付费观看功能&#xff0c;为创作者们提供了一个展示才华…

跟TED演讲学英文:Your right to repair AI systems by Rumman Chowdhury

Your right to repair AI systems Link: https://www.ted.com/talks/rumman_chowdhury_your_right_to_repair_ai_systems Speaker: Rumman Chowdhury Date: April 2024 文章目录 Your right to repair AI systemsIntroductionVocabularySummaryTranscriptAfterword Introduct…

PbootCms微信小程序官网模版/企业官网/社交电商官网/网络工作室/软件公司官网

在数字化时代&#xff0c;企业网站已成为吸引潜在客户、提升企业形象、和扩大品牌影响力的必备工具。因此&#xff0c;一个优秀的企业网站模板显得尤为重要。 企业官网的内容框架通常都包含企业形象、产品或服务类型、信息展示等部分&#xff0c;设计师需要借助和企业形象契合…

大模型的竞争格局与产品经理的未来机遇

前 言 作为产品经理&#xff0c;很重要的一点是要紧跟技术发展的潮流。大型语言模型&#xff08;LLM&#xff09;的竞争格局日新月异&#xff0c;谁会成为最终的赢家尚未可知。在这篇博文中&#xff0c;我们将介绍我们的一些重要观察发现&#xff0c;主要涉及直接面向消费者的…

2024年华为OD机试真题-多段线数据压缩-C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集)​ 题目描述: 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多段线的走向只能是水平、竖直、斜向45度。 上图中的多段线可以用下面的坐标串表示:(2, 8), (3…

T-Pot多功能蜜罐实践@debian12@FreeBSD

T-Pot介绍 T-Pot是一个集所有功能于一身的、可选择分布式的多构架&#xff08;amd64&#xff0c;arm64&#xff09;蜜罐平台&#xff0c;支持20多个蜜罐和很多可视化选项&#xff0c;使用弹性堆栈、动画实时攻击地图和许多安全工具来进一步改善欺骗体验。GitHub - telekom-sec…

Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)

文章目录 前言声明一、netfilter介绍二、漏洞成因三、漏洞危害四、影响范围五、漏洞复现六、修复方案临时解决方案升级修复方案 前言 2024年1月&#xff0c;各Linux发行版官方发布漏洞公告&#xff0c;修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞&#xff08;CVE-…

若尔盖草原亲子研学营 | 八月份开启

若尔盖草原亲子研学营&#xff0c;追寻父辈记忆&#xff0c;探索绿色圣境 Following the Footsteps of our Ancestors, Exploring the Maganificent Grassland . Parent -Child Summer Camp 身处繁忙的城市生活中 您是否曾在梦中追寻父亲的足迹 渴望重温他在草原上自由驰骋的…

PPINtonus (深度学习音调分析)帕金森病早期检测系统

帕金森病&#xff08;Parkinson’s Disease&#xff0c;简称PD&#xff09;是一种主要影响运动功能的进行性神经退行性疾病。这种疾病主要是由于大脑中一个名为黑质&#xff08;substantia nigra&#xff09;的区域失去产生多巴胺的神经元而引起的。PD的主要运动症状包括震颤、…