指针进阶详解(下)

这篇具有很好参考价值的文章主要介绍了指针进阶详解(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在指针进阶详解(上)中,我们已经介绍了部分指针进阶相关知识,接下来我们将继续介绍指针进阶相关知识。

1. 函数指针

我们知道数组指针,是一个指向数组的指针。同理,函数指针是一个指向函数的指针。
既然是函数指针,就需要取出函数的地址。那函数的地址如何得到呢?

首先我们先看以下代码:

void test()
{
	printf("hehe\n");
}

int main()
{
	printf("%p\n", test);
	printf("%p\n", &test);
	return 0;
}

运行结果:
指针进阶详解(下),c语言,c++,开发语言
输出的两个地址就是test()函数的地址。那函数的地址如何保存起来呢?
下面再来看看这段代码:

void test()
{
	printf("hehe\n");
}

//下面pfun1和pfun2那个有能力存放test函数的地址呢?
void (*pfun1)();
void* pfun2();

首先,能存储地址,要求pfun1或pfun2是指针,那哪个可以?答案是:

pfun1可以存放。pfun1先和*结合,说明pfun1是一个指针;在和()结合,说明指针指向的是一个函数;最后和int结合,说明函数的返回类型是int。即,fun1指向一个返回int类型数据的函数。

1.1 两端有趣代码

//代码一
(*(void (*)())0)()
//解读:首先假设有一个数子:OX23FC11。如果仅是这个数字,我们可以认为他是一个地址,也可以是一个16进制数字
//同理,这里0也可以理解为一个地址,只是值比较特殊为0
//1.将0强制类型转换为void(*)()
//2.调用0处的函数

//代码二
void (*signal(int, void (*)(int)))(int);
//signal函数的一个声明
//1.signal函数有两个参数,第一个参数是int类型;第二个参数为int无返回值的函数指针类型
//2.signal函数的返回值是也是void(*)(int)函数指针类型,该函数指针指向的函数有一个int类型的参数,返回类型是void

代码二太复杂,如何简化呢?

typedef void(*pfun_t)(int)
pfun_t signal (int, pfun_t)

2. 函数指针数组

数组是一个存放相同类型数据的存储空间,我们已经介绍过指针数组,比如:

int *arr[10];
//数组的每个元素是int*

那要把函数的地址存放到一个数组中,那这个数组就叫函数指针数组。
那函数指针数组如何定义?

int (*parr1[10])();
//parr1先和[]结合,说明parr1是一个数组;数组的每个元素是int (*)()函数指针类型。

2.1 函数指针数组的用途之一:转移表

使用函数指针数组实现简单计算器:

#include <stdio.h>

int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}

int main()
{
	int input = 0;
	int (*p[5])(int x, int y) = { NULL, add, sub, mul, div };//转移表
	do
	{
		int x = 0; 
		int y = 0;
		int ret = 0;
		printf("XXXXXXXXXXXXXXXXXXXXXX\n");
		printf("XXXX 1.add  2.sub XXXX\n");
		printf("XXXX 3,mul  4.div XXXX\n");
		printf("XXXX 0.exit      XXXXX\n");
		printf("XXXXXXXXXXXXXXXXXXXXXX\n");

		printf("请选择:>\n");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = p[input](x, y);
			printf("%d\n", ret);
		}
		else
		{
			printf("输入错误,重新输入\n");
		}
	} while (input);
	return 0;
}

3. 指向函数指针数组的指针

指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素是数组指针。

如何定义?

void test(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	//函数指针pfun
	void (*pfun)(char*) = test;
	//函数指针的数组pfunArr
	void (*pfunArr[5])(char*) = test;
	//指向函数指针的数组pfunArr的指针ppfunArr
	void (*(*pfunArr)[5])(char*) = test;
	return 0;
}
  • 不建议初学者直接上手写最终结果,而是根据上面过程一步步修改添加得到。

4. 回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是有函数的实现方直接调用,而是在特定的事件或条件发生时有另一方调用,用于对该事件或条件进行响应。

回调函数的应用

#include <stdio.h>
#include <stdlib.h>
//库函数中有一个函数qsort()是用来排序的
int cmp(const void* p1, const void* p2)
{
	//升序
	return *(int*)p1 - *(int*)p2;
	//降序
	//return *(int*)p2 - *(int*)p1;
}

int main()
{
	int arr[] = { 12,43,87,34,56,3,5,1,86 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp);//通过指针调用cmp函数,所以cmp()函数为回调函数
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

冒泡排序模拟实现qsort()函数

5. 结尾

本篇博客到此就结束了。创作不易,如果对你有帮助记得三连哦!感谢您的支持!!
指针进阶详解(上)
指针和数组笔试题解析文章来源地址https://www.toymoban.com/news/detail-569185.html

到了这里,关于指针进阶详解(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】进阶指针,超详解,含丰富代码示例

    这里是初阶的链接,方便大家对照查看!!!添加链接描述 大家好呀,今天和大家将指针进阶的知识进行分享,这块是指针的难点部分,希望博主对其的理解可以帮助到大家!!! 字符指针 数组指针 指针数组 函数指针 函数指针数组 指向函数指针数组的指针 在指针的类型

    2024年02月13日
    浏览(40)
  • 【进阶C语言】进阶指针--学会所有指针类型

     本节内容大致目录: 1.字符指针 2.指针数组(数组) 3.数组指针 (指针)--比较重要 4.函数指针--比较重要 5.函数指针数组--用的较少 6.指向函数指针数组的指针--只需要了解就可以 需要掌握每一种类型的符号和用处。 前言:字符指针是一种指针,是众多指针类型中的一种。

    2024年02月07日
    浏览(42)
  • 【C语言进阶】 指针进阶(二)

    🔥 博客主页: 小王又困了 📚 系列专栏: C语言 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论 ✍️ 目录 一.函数指针  1.1函数指针的认识 1.2函数指针的使用 二、函数指针数组 1.1函数指针的认识 1.2 函数指针数组实现计算器  三、指向函数指针数组的指针

    2024年02月15日
    浏览(41)
  • 『C语言进阶』指针进阶(二)

    🔥 博客主页 : 小羊失眠啦 🔖 系列专栏 : C语言 🌥️ 每日语录 : 无论你怎么选,都难免会有遗憾。 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 在上篇指针进阶中,我们对字符指针、指针数组、数组指针以及数组传参和指针传参有了一定的了解,你以为指针进阶就只有这些内

    2024年02月07日
    浏览(39)
  • 『C语言进阶』指针进阶(一)

    🔥 博客主页 : 小羊失眠啦 🔖 系列专栏 : C语言 🌥️ 每日语录 : 无论你怎么选,都难免会有遗憾。 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 在C语言初阶中,我们对指针有了一定的了解,指针是个变量,是用来存放地址的,指针的大小是固定的4/8个字节,指针是有类型的

    2024年02月09日
    浏览(36)
  • 【C语言】指针进阶:字符指针&&数组指针&&函数指针

    ✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 🌹 感谢您的点赞与关注,同时欢迎各位有空来访我的 🍁平凡舍 回想之前,我们学了 指针 的一些基础👉 指针与结构体 我们知道了指针的概念: 指针就是

    2023年04月08日
    浏览(42)
  • 【C语言进阶】指针数组 —— 数组指针

    🎬 鸽芷咕 : 个人主页  🔥 个人专栏 : 《C语言进阶篇》 《C语言初阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,前面我们已经把指针大部分内容给学完了,今天就给大家带来数组指针or指针数组!    ⛳️ 很多说这俩名字不是差不

    2024年02月14日
    浏览(36)
  • 进阶C语言-指针的进阶(三)

    📝关于 qsort函数 ,我们可以先去cpluplus网站上面了解一下: ✅运行示例: 🔎我们发现上述代码只适用于整型数据,那么我们是否能写出更一般的更普遍的代码呢? ✅运行示例: 📖运行流程如下: 🔎按照年龄排序: ✅运行示例: 🔎按照姓名排序: ✅运行示例: 好啦,

    2024年02月05日
    浏览(45)
  • C语言进阶之指针的进阶

    指针的主题,我们在C语言初阶博客已经接触过了,我们知道了指针的概念: 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候

    2024年02月16日
    浏览(38)
  • 进阶C语言-指针的进阶(中)

    数组指针 - 指向数组的指针 - 存放的是数组的地址 - 数组名就是数组的地址。 函数指针 - 指向函数的指针 - 存放的是函数的地址 - 函数名就是函数的地址。 🔭阅读下面这两段代码: 🔭 指针数组: 字符指针数组 - 数组 - 存放的是字符指针 整型指针数组 - 数组 - 存放的是整

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包