详解指针(进阶版)(1)
前言:总篇章分为(1)和(2),本篇内容包括:指针数组,数组指针,&数组名与数组名的区分
数组传参 ,函数指针,函数指针数组
part 1:指针数组
指针数组是存放指针的数组
int* arr1[10]; //整形指针的数组——数组10个元素,每个元素的类型是整型指针int*
char *arr2[4]; //一级字符指针的数组——数组4个元素,每个元素的类型是字符指针char*
char **arr3[5];//二级字符指针的数组——数组5个元素,每个元素的类型是二级字符指针
part 2:数组指针
数组指针是指向数组的指针
int (*p)[10]; 数组指针
解释:p先和*结合表明p是一个指针,指向一个数组,数组10个元素,每个元素的类型是int
数组指针的使用:比如打印一个二维数组
void print_arr(int(*arr)[5], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf("%d ", arr[i][j]); // 或者: *(*(arr+i)+j) // 因为arr是二维数组第一行的地址,即arr指向了第一行// arr+i:可以指向二维数组的第i行,代表的是第i行的地址// *(arr+i)就可以得到第i行的数组名//比如 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//int (* p)[10] = &arr;//p --- &arr//*p --- *&arr//*p --- arr}printf("\n");}
}
int main()
{int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };print_arr(arr, 3, 5);return 0;
}
我们知道数组指针中存放的是数组的地址
二维数组的数组名arr:数组名是数组首元素的地址,即二维数组的数组名是二维数组首元素的地址
二维数组的首元素是第一行,即第一行的一维数组
故而二维数组的数组名arr代表的是第一行的地址,即一个一维数组的地址,需要使用数组指针接收:int(*arr)[5]
辨析指针数组和数组指针:
int arr[5]; //数组
int *parr1[10]; // 整型指针数组 - parr1是一个数组,数组10个元素,每个元素的类型是int*
int (*parr2)[10]; // 整型数组指针 - parr2是指针,指向一个数组,数组10个元素,每个元素的类型是int
int (*parr3[10])[5]; // 存放整型数组指针的数组 - parr3是数组,10个元素,每一个元素都是数组指针
part 3: &数组名与数组名的区分
数组名在绝大部分情况下是数组首元素的地址
只有两个特殊情况下,数组名代表整个数组
特殊情况1:sizeof(数组名):此时的数组名代表整个数组,sizeof计算的是整个数组的大小
特殊情况2:&数组名:此时取出的是整个数组的地址
part 4: 数组传参
一维数组传参:
#include <stdio.h>
//数组形式接收
void test(int arr[])//ok
{}
void test(int arr[10])//ok
{}
//指针形式接收
void test(int *arr)//ok
{}void test2(int *arr[20])//ok
{}
void test2(int **arr)//ok - arr2是数组名,即数组首元素的地址,即int*的地址,一级指针的地址用二级指针接收
{}int main()
{int arr[10] = {0};int *arr2[20] = {0};test(arr);test2(arr2);
}
二维数组传参:
void test(int arr[3][5])//ok
{}
void test(int arr[][])//NO 行可以省略,列不能省略
{}
void test(int arr[][5])//ok
{}
void test(int *arr)//NO arr是二维数组的数组名,是二维数组首元素(即第一行的一维数组)的地址,需要使用数组指针接收
{}
void test(int* arr[5])//NO
{}
void test(int (*arr)[5])//ok
{}
void test(int **arr)//NO
{}
int main()
{int arr[3][5] = {0};test(arr);
}
part 5:函数指针
函数名和&函数名都是函数的地址
void test()
{printf("hehe\n");
}
存放以上函数地址的函数指针:void (*p)()
解读:p先和*结合,说明p是一个指针,p后面有()说明p指向一个函数,函数无参,返回类型是void
当有了函数地址后,要通过函数指针对函数进行调用,可以解引用也可以不解引用
比如:
int Add(int x, int y)
{return x + y;
}
int main()
{int (* pf)(int, int) = Add;//pf是一个函数指针,指向一个函数,两个参数都是int类型,返回类型也是int类型int ret = (*pf)(3, 5); int ret = Add(3, 5);int ret = pf(3, 5);
}
下面来阅读两个有趣的代码:
不要慌,我们慢慢分析:
代码1是对函数的调用
(* (void (*)()) 0 ) ();// void (*)()是一个函数指针类型,(类型)是强制类型转换
// 故而:
// 1 将0强制转换成void (*)()类型的函数指针
// 2 0地址处存放着一个函数,函数无参,返回类型是void
// 3 对0地址处的函数进行调用
代码2是函数的声明
void (*signal(int , void(*)(int)) )(int);
// signal后面跟着(),说明signal是一个函数,该函数的第一个参数是int类型,第二个参数是 void(*)(int)
// 除却signal(int , void(*)(int))以外,剩下的都是signal函数的返回类型:void(*)(int)
part 6:函数指针数组
函数指针数组存放的是函数指针
int (*p[10])()
解释:p先和[]结合,说明p十个数组,数组十个元素,
每个元素的类型都是函数指针:int (*)()
函数指针数组的使用例子:简易计算器
#include<stdio.h>
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;int (*arr[5])(int , int ) = { NULL,Add,Sub,Mul,Div };int x = 0;int y = 0;int ret = 0;do{menu();printf("请选择:");scanf("%d", &input);if (input == 0){printf("退出计算器\n");break;}else if (input >= 1 && input <= 4){printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = arr[input](x, y);printf("%d\n", ret);}else{printf("选择错误,请重新选择\n");}} while (input);return 0;
}
相关文章:

详解指针(进阶版)(1)
前言:总篇章分为(1)和(2),本篇内容包括:指针数组,数组指针,&数组名与数组名的区分 数组传参 ,函数指针,函数指针数组 part 1:指…...

【OJ】盐荒子孙
📚Description: 盐体图 盐是对人类生存具有重要意义的物质之一。当中国古人从肉食为主转向谷食为主的时候,吃盐的需求就发生了,因为动物血肉里面包含有足够人体所需的盐分,而谷 物本身不包含盐分。在长达几十万年的旧石器时代&…...

Java数据结构 —— 手写线性结构(稀疏数组、栈、队列、链表)
目录 稀疏数组 顺序表 链表 单向顺序链表 双向链表 双向循环链表求解约瑟夫环(Joseph) 栈 顺序栈 队列 顺序队列 顺序循环队列 稀疏数组 当一个数组中大部分值为0,或者相同时,可以采用稀疏数组的方式来保存,从而节约存储…...

docker部署gitlab过程中遇到的一些问题记录
文章目录用nginx代理docker部署的gitlab服务密码重置docker0网卡异常离线安装apt的包用nginx代理docker部署的gitlab服务 一般咱们不会去暴露很多端口给外面,所以部署完gitlab后,我希望能够用nginx来代理我们的gitlab服务。 gitlab的docker部署参考这个…...

数组的定义与使用
文章目录 数组的基本概念数组的基本用法数组与方法互操作一、数组的基本概念 数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。 注意:1. 数组中存放的元素其类型相同 2. 数组的空间是连在一起的 3. 每个空间有自己的编号࿰…...

SAP ABAP用程序删除开发KEY
在BASISI系统管理中,用户的开发Key存储在DEVACCESS表中,如果由于审计需要删除一些用户的开发Key,而系统有限制SM30, SE16 or SE16N 等事务码的使用,你就可以通过一个小程序去删除开发Key。 代码如下: REPORT ZBCDEV…...

安卓设备TF卡概率性无法识别问题
现象 使用t卡的设备出货前检测是正常的,放在仓库中或出货后再开机,有概率的机器无法识别,重新插拔或重启无效,拔下来放pc电脑上识别后再插回设备则恢复正常能识别。 设备信息 系统: Android 8.1.0 数量:抽检有12%的设备无法识别 TF卡:SanDisk Ultra 64GB 10 A1 microS…...

linux安装nodejs和微信小程序自动化部署操作
一.运行环境安装 Node.js 并且版本大于 8.0基础库版本为 2.7.3 及以上开发者工具版本为 1.02.1907232 及以上安装node.js(1).下载node包官网地址:https://nodejs.org/en/download/如果英文不好的,可以看中文网站:https://nodejs.org/zh-cn/download/点击上面的进行下载,当然,也…...

JavaScript高级 Proxy Reflect
1. Proxy 1. 监听对象的变化 有一个对象,我们希望监听这个对象中的属性被设置或获取的过程 我们可以通过 Object.defineProperty 来实现 const obj {name: "why",age: 18,height: 1.88 }// 需求: 监听对象属性的所有操作 // 监听属性的操作 // 1.针对…...

Eth-trunk :LACP模式链路聚合实战
Eth-trunk : LACP模式链路聚合实战 需求描述 PC1和PC3数据vlan10 ,网段为192.168.10.0 /24PC2和PC4数据vlan20 ,网段为192.168.20.0 /24确保设备之间互联互通,使用最大互联带宽并没有环路确保相同网段的PC可以互通判断交换机之间的每个端口…...

【第二章 - 线性表之顺序表】- 数据结构(八千字详解)
目录 一、线性表的定义和特点 二、线性表的顺序表示和实现 2.1 - 线性表的顺序存储表示 2.2 - 顺序表中基本操作的实现 三、练习 3.1 - 移除元素 3.2 - 删除有序数组中的重复项 3.3 - BC100 有序序列合并 3.4 - 88.合并两个有序数组 四、顺序表的问题及思考 线性表、…...

【史上最全面esp32教程】RGB彩灯篇
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录rgb彩灯的介绍使用方法连线库操作彩灯变换颜色实验彩灯呼吸灯效果总结提示:以下是本篇文章正文内容,下面案例可供参考 rgb彩灯的介绍 ESP32…...

大规模 IoT 边缘容器集群管理的几种架构-5-总结
前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad大规模 IoT 边缘容器集群管理的几种架构-3-Portainer大规模 IoT 边缘容器集群管…...

逆风翻盘拿下感知实习offer,机会总是留给有准备的人
个人背景211本,985硕,本科是计算机科学与技术专业,研究生是自学计算机视觉方向,本科主要做C和python程序设计开发,java安卓开发,研究生主要做目标检测,现在在入门目标跟踪和3d目标检测。无论文&…...

SpringBoot整合阿里云OSS文件上传、下载、查看、删除
SpringBoot整合阿里云OSS文件上传、下载、查看、删除1、开发准备1.1 前置知识1.2 环境参数1.3 你能学到什么2. 使用阿里云OSS2.1 创建Bucket2.2 管理文件2.3 阿里云OSS文档3. 项目初始化3.1 创建SpringBoot项目3.2 Maven依赖3.3 安装lombok插件4. 后端服务编写4.1 阿里云OSS配置…...

对话数字化经营新模式:第2届22客户节(22Day)年猪宴圆满结束!
2023年2月22日,由杭州电子商务研究院联合贰贰网络(集团)、TO B总监联盟等发起举办的“第二届客户节22Day”暨2022年度爱名奖 AM AWARDS颁奖及22年猪宴沙龙活动圆满结束。 (主持人:杜灵芝) 本次沙龙邀请到浙江工业大学管理学院程志…...

数据结构——第二章 线性表(5)——双向循环链表
双向循环链表1.双向循环链表的定义2.双向循环链表的基本操作实现2.1 双向循环链表的初始化操作2.2.双向循环链表的插入操作2.3. 双向循环链表的删除操作1.双向循环链表的定义 单向链表便于查询后继结点,不便于查询前驱结点。为了方便两个方向的查询,可以…...

4面美团软件测试工程师,却忽略了这一点,直接让我前功尽弃
说一下我面试别人时候的思路 反过来理解,就是面试时候应该注意哪些东西;用加粗部分标注了 一般面试分为这么几个部分: 一、自我介绍 这部分一般人喜欢讲很多,其实没必要。大约5分钟内说清楚自己的职业经历,自己的核…...

robot remote server用这个server去远程获取ip
server端配置: 1、安装python环境 2、下载robot remote server 下载地址:https://pypi.python.org/pypi/robotremoteserver/(不要用pip下载,把robotremoteserver.py文件下载下来) 3、首先创建一个目录E:\rfremote\ &a…...

【WSL】Windows 上安装并启动
一、什么是 WSL Windows Subsystem for Linux 适用于 Linux 的 Windows 子系统 可以帮助我们自然、方便地在 Windows 上使用 Linux 子系统 二、安装 我们要安装的是 WSL2 , 因为其功能相对来说更加完善 1. 简化安装 — 本人亲测不好用 简化安装:高…...

SAFe(Scaled Agile Framework)学习笔记
1.SAFe 概述 SAFe(Scaled Agile Framework)是一种面向大型企业的敏捷开发框架,旨在协调多个团队和部门的协同工作,以实现高效的软件开发和交付。下面是SAFe框架的简单介绍总结: SAFe框架包括以下四个层次:…...

Redis 集群搭建
前缀参考文章1:Centos7 安装并启动 Redis-6.2.6 前缀参考文章2:Redis 主从复制-服务器搭建【薪火相传/哨兵模式】 管道符查看所有redis进程:ps -ef|grep redis 杀死所有redis进程:killall redis-server 1. 首先修改 redis.conf 配…...

【Unity VR开发】结合VRTK4.0:创建物理按钮
语录: 如今我努力奔跑,不过是为了追上那个曾经被寄予厚望的自己 前言: 使用线性关节驱动器和碰撞体从动器可以轻松创建基于物理的按钮,以使交互者能够在物理上按下按钮控件,然后挂钩到驱动器事件中以了解按钮何时被按…...

【软件测试】web自动化测试如何开展合适?自动化测试用例如何设计?资深测试的总结......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 首先,还…...

ARouter::Compiler The user has configuration the module name, it was
学习组件化使用的是阿里的ARouter,我是照着案例敲的,在编译的时候报了这么一个错。 我查了好多资料,大部分都是说build.gradle 配置出现了问题,比如没有配置 javaCompileOptions {annotationProcessorOptions {arguments [AROUTE…...

Jmeter(GUI模式)详细教程
Jmeter(GUI模式)详细教程 目录:导读 一、安装Jmeter 二、Jmeter工作原理 三、Jmeter操作步骤 Jmeter界面 1、测试计划 2、线程组 3、HTTP请求 4、监听器 四、压力测试 写在最后 前些天,领导让我做接口的压力测试。What…...

2023年CDGA考试-第14章-大数据和数据科学(含答案)
2023年CDGA考试-第14章-大数据和数据科学(含答案) 单选题 1.MapReduce模型有三个主要步骤 () A.剖析、关联、聚类 B.提取、转换、加载 C.映射、修正、转换 D.映射、洗牌、归并 答案 D 2.以下哪种技术已经成为面向数据科学的大数据集分析标准平台。 A.MPP技术。 B.Hado…...

【阿旭机器学习实战】【36】糖尿病预测---决策树建模及其可视化
【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。 【阿旭机器学习实战】【36】糖尿病预测—决策树建模及其可视化 目录【阿旭机器学习实战】【36】糖尿病预测---决策树建模及其可视化1. 导入数据并…...

简易黑客初级教程:黑客技术,分享教学
第一节,伸展运动。这节操我们要准备道具,俗话说:“工欲善其事,必先利其器”(是这样吗?哎!文化低……)说得有道理,我们要学习黑客技术,一点必要的工具必不可少。 1,一台属于自己的可以上网的电…...

日本公派访问学者的具体申请流程
公派日本访问学者的具体申请流程,知识人网整理了相关的资料以供大家参考。第一、申请材料一般申请CSC日本访问学者,截止日是每年的1月15号左右,但是学院在1月10号之前就审查材料了。材料包括:CSC网页的报名表,教授邀请…...