C语言进阶版第9课—指针(3)

news2024/11/18 3:49:31

文章目录

  • 1. 字符指针变量
  • 2. 数组指针变量
  • 3. 二维数组传参的本质
  • 4. 函数指针变量
  • 5. typedef关键字
  • 6. 函数指针数组
  • 7. 函数指针数组的应用—转移表

1. 字符指针变量

在这里插入图片描述
在这里插入图片描述

  • 练习题
    在这里插入图片描述
    在这里插入图片描述

2. 数组指针变量

  • 在学习数组指针前,我们先回忆一下什么是指针数组
  • 指针数组 → 存放指针的数组 → char* arr[ ] = { ‘a’, ‘b’ ,‘c’};
  • 那么什么是数组指针变量呢?
  • 数组指针变量 → 存放数组地址,指向数组的指针变量
  • 我们来看一段代码
#include <stdio.h>
int main()
{
	int* p1[10];     //p1是什么
	int(*p2)[10];    //p2是什么
	return 0;
}
  • 指针数组
  • int*  p1   [10];
      |     |    |
      |     |  数组元素个数
      |   数组名
    表示数组每个元素都是int*类型
  • 数组指针变量
  • int  (*p2)   [10];
      |     |    |
      |     |  p2指向数组的元素个数
      |   p2是数组指针变量
    p2指向的数组的元素类型

在这里插入图片描述

3. 二维数组传参的本质

  • 前面我们学过二维数组
  • int  arr  [5]   [10];
      |     |    |   |
      |     |    | 数组每个元素的内容
      |     | 数组元素个数
      |  数组名
    表示数组每个元素都是int类型
  • 二维数组传参
    在这里插入图片描述
    在这里插入图片描述
    二维数组传参,形参可用数组,也可用指针

4. 函数指针变量

  • 函数地址
    在这里插入图片描述
  • 函数指针变量 —→ 存放函数地址
  • int  (*p1)   (int x,int y);
       |     |     ------------
       |     |       |
       |     |     p1所指函数的参数类型和个数
       |   函数指针变量
    p1指向函数的返回类型在这里插入图片描述
  • 练习
    在这里插入图片描述
    在这里插入图片描述

5. typedef关键字

  • typedef是用来类型重定义的
    在这里插入图片描述

6. 函数指针数组

  • 存放函数指针(相同类型)的数组
    在这里插入图片描述

7. 函数指针数组的应用—转移表

转移表
优化前
#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;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	do
	{
		printf("-----------------------\n");
		printf("-----1.add    2.sub----\n");
		printf("-----3.mul    4.div----\n");
		printf("-------- 0.exit -------\n");
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = add(x, y);
			printf("ret=%d\n", ret);
			break;
		case 2:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("ret=%d\n", ret);
			break;
		case 3:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("ret=%d\n", ret);
			break;
		case 4:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("ret=%d\n", ret);
			break;
		case 0:
			printf("退出\n");
			break;
		default:
			printf("输入错误");
			break;
		}
	} while (input);
	return 0;
}
  • 优化
    在这里插入图片描述
//优化后
#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;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*ptr[5])(int, int) = { 0,add,sub,mul,div };
	do
	{
		printf("-----------------------\n");
		printf("-----1.add    2.sub----\n");
		printf("-----3.mul    4.div----\n");
		printf("-------- 0.exit -------\n");
		printf("请选择:");
		scanf("%d", &input);
		if (input <= 4 && input >= 1)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (*ptr[input])(x, y);
			printf("ret=%d\n", ret);
		}
		else if (input == 0)
			printf("退出\n");
		else
			printf("输入错误\n");
	} while (input);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

Unity Addressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统&#xff0c;并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址&#xff08;Addressable&#xff09;时&#xff0c;您可以使用该资源的地址从任何地方加载它。无论资源是在…

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【PWN · 栈溢出 | GOT劫持】[2024 · 长城杯]consumption

通过代码审计&#xff0c;找到栈溢出漏洞点&#xff0c;覆盖关键栈变量&#xff0c;实现任意地址写 前言 本题主要是套壳了Cjson&#xff0c;实则是约定了输入格式。通过仔细代码审计&#xff0c;即可找到栈溢出&#xff0c;并实现利用 一、题目 查阅网上资料&#xff0c;得知…

如何提取视频中的音频?新手也能轻松搞定

在数字媒体处理中&#xff0c;从视频文件中提取音频是一个常见需求。无论你是希望为视频制作单独的音频版本&#xff0c;还是想将某段视频的背景音乐用于其他项目&#xff0c;掌握音频提取技术都至关重要。本文将详细介绍几种提取视频中音频的方法&#xff0c;帮助你轻松实现这…

【自考zt】【软件工程】【21.04】(部分)

一、单选 二、填空 三、简答 四、应用 小结&#xff1a;

DeepSeek缓存命中技术,成本降低10倍

DeepSeek系列升级&#xff1a; DeepSeek发布最新的缓存命中技术&#xff0c;有效降低成本至0.1元/百万tokens&#xff0c;适用于文件读取和固定提示词。 点评&#xff1a;由于token消耗大部分是在系统提示词中&#xff0c;妥善使用确实可以极大降低成本&#xff0c;同时还能保证…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…

[git操作] git创建仓库上传github报错

操作流程如下 使用 git init使用 git remote add origin 项目ssh链接git add . 报错如下 Bus error (core dumped)然后执行任何别的操作都会报错&#xff1a; fatal: Unable to create path .. /.git/index.lock: File exists.Another git process seems to be running in …

​全国计算机软件中级资料分享

全国计算机软件中级资料分享 软考资料分析 软件设计师中间 免费资料 链接:https://pan.baidu.com/s/1GqbgIq_D0uZd-uuhIhG-Sg?pwd2atp 提取码:2atp 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 求个免费关注不过分吧。

vue实现评论滚动效果

vue插件实现滚动效果 一、安装组件 官网地址&#xff1a;https://chenxuan0000.github.io/vue-seamless-scroll/ 1、vue2安装 npm install vue-seamless-scroll --savevue3安装 npm install vue3-seamless-scroll --save二、组件引入 <template><div v-if"…

OpenCV 与 Matplotlib 的结合使用:轮毂检测与目标跟踪

目录 绘制轮廓图像 实现思路 1. 读取图像并转换为灰度图像 2. 二值化处理 3. 查找轮廓 4. 绘制轮廓 5. 显示结果 代码实现 效果展示 动态逐步显示轮廓结果 实现思路 1. 读取图像并缩放 2. 转换为灰度图像 3. 二值化处理 4. 查找轮廓 5. 动态显示轮廓 6. 显示最…

基于图神经网络的最大独立集问题的目标分支

文章目录 Abstract1 Introduction2 Related Work分支顶点选择图神经网络Abstract 分支归约方法结合了分支约束原则和归约规则,在处理以前无法管理的现实世界实例方面特别成功。分支策略决定下一个要在哪个顶点上进行分支。最近,最广泛使用的策略是选择最高度的顶点。 在这项…

C++为什么要引入智能指针?

智能指针的必要性 C 引入智能指针主要是为了解决手动管理动态分配内存时可能出现的几个问题&#xff0c;特别是内存泄漏、野指针和异常安全等问题。智能指针通过封装原始指针的操作&#xff0c;提供自动化的内存管理机制&#xff0c;以减少这些问题的发生。 具体来说&#xff…

c++基础补充

c基础补充 函数补充函数声明函数的分文件编写 指针补充占用大小空指针坏指针野指针 C内存分区模型 函数补充 函数声明 #include <iostream> using namespace std;int max(int a,int b);int main() {int result max(1,3);cout << result << endl;return 0;…

皮肤表皮层

表皮层的细胞大都是由基底层细胞分裂分化而来, 1:角质层 2:透明层 3:颗粒层 4:棘状层 5:基底层角质层 组成:由10-20 死细胞组成 细胞膜很厚 细胞核及胞器消失 细胞间隙被脂质连接 透明层 只出现在手掌和脚掌中 颗粒层 2-4层细胞角质细胞 活细胞 棘状层 有免疫…

chapter13-常用类——(Date、Calendar、LocalDate)—day17

目录 488-Date介绍 489-Date应用实例 490-Calendar介绍 491-Calendar应用实例 492-第三代日期使用 493-第三代日期方法 494-String翻转 495-注册处理题 496-字符串统计 497-String内存布局测试题 488-Date介绍 IDEA里面的properties是set/get方法 489-Date应用实例 49…

网络编程(UDP)

UDP编程 UDP&#xff1a;全双工通信、面向无连接、不可靠 UDP&#xff08;User Datagram Protocol&#xff09;用户数据报协议&#xff0c;是不可靠的无连接的协议。在数据发送前&#xff0c;因为不需要进行连接&#xff0c;所以可以进行高效率的数据传输。 适用场景 发送小尺寸…

transforemr网络理解

1.transformer网络中数据的流动过程&#xff1a; 2.transformer中残差的理解&#xff1a; 残差连接&#xff08;Residual Connection&#xff09; 的核心思想就是通过将输入与经过变化的输出相加&#xff0c;来最大限度地保留原始信息。 transforemr中注意力层网络和前馈神经…