当前位置: 首页 > news >正文

详解指针(进阶版)(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)

前言&#xff1a;总篇章分为&#xff08;1&#xff09;和&#xff08;2&#xff09;&#xff0c;本篇内容包括&#xff1a;指针数组&#xff0c;数组指针&#xff0c;&数组名与数组名的区分 数组传参 &#xff0c;函数指针&#xff0c;函数指针数组 part 1&#xff1a;指…...

【OJ】盐荒子孙

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

Java数据结构 —— 手写线性结构(稀疏数组、栈、队列、链表)

目录 稀疏数组 顺序表 链表 单向顺序链表 双向链表 双向循环链表求解约瑟夫环&#xff08;Joseph&#xff09; 栈 顺序栈 队列 顺序队列 顺序循环队列 稀疏数组 当一个数组中大部分值为0,或者相同时&#xff0c;可以采用稀疏数组的方式来保存&#xff0c;从而节约存储…...

docker部署gitlab过程中遇到的一些问题记录

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

数组的定义与使用

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

SAP ABAP用程序删除开发KEY

在BASISI系统管理中&#xff0c;用户的开发Key存储在DEVACCESS表中&#xff0c;如果由于审计需要删除一些用户的开发Key&#xff0c;而系统有限制SM30, SE16 or SE16N 等事务码的使用&#xff0c;你就可以通过一个小程序去删除开发Key。 代码如下&#xff1a; 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. 监听对象的变化 有一个对象&#xff0c;我们希望监听这个对象中的属性被设置或获取的过程 我们可以通过 Object.defineProperty 来实现 const obj {name: "why",age: 18,height: 1.88 }// 需求: 监听对象属性的所有操作 // 监听属性的操作 // 1.针对…...

Eth-trunk :LACP模式链路聚合实战

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

【第二章 - 线性表之顺序表】- 数据结构(八千字详解)

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

【史上最全面esp32教程】RGB彩灯篇

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录rgb彩灯的介绍使用方法连线库操作彩灯变换颜色实验彩灯呼吸灯效果总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 rgb彩灯的介绍 ESP32…...

大规模 IoT 边缘容器集群管理的几种架构-5-总结

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

逆风翻盘拿下感知实习offer,机会总是留给有准备的人

个人背景211本&#xff0c;985硕&#xff0c;本科是计算机科学与技术专业&#xff0c;研究生是自学计算机视觉方向&#xff0c;本科主要做C和python程序设计开发&#xff0c;java安卓开发&#xff0c;研究生主要做目标检测&#xff0c;现在在入门目标跟踪和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日&#xff0c;由杭州电子商务研究院联合贰贰网络(集团)、TO B总监联盟等发起举办的“第二届客户节22Day”暨2022年度爱名奖 AM AWARDS颁奖及22年猪宴沙龙活动圆满结束。 &#xff08;主持人&#xff1a;杜灵芝&#xff09; 本次沙龙邀请到浙江工业大学管理学院程志…...

数据结构——第二章 线性表(5)——双向循环链表

双向循环链表1.双向循环链表的定义2.双向循环链表的基本操作实现2.1 双向循环链表的初始化操作2.2.双向循环链表的插入操作2.3. 双向循环链表的删除操作1.双向循环链表的定义 单向链表便于查询后继结点&#xff0c;不便于查询前驱结点。为了方便两个方向的查询&#xff0c;可以…...

4面美团软件测试工程师,却忽略了这一点,直接让我前功尽弃

说一下我面试别人时候的思路 反过来理解&#xff0c;就是面试时候应该注意哪些东西&#xff1b;用加粗部分标注了 一般面试分为这么几个部分&#xff1a; 一、自我介绍 这部分一般人喜欢讲很多&#xff0c;其实没必要。大约5分钟内说清楚自己的职业经历&#xff0c;自己的核…...

robot remote server用这个server去远程获取ip

server端配置&#xff1a; 1、安装python环境 2、下载robot remote server 下载地址&#xff1a;https://pypi.python.org/pypi/robotremoteserver/&#xff08;不要用pip下载&#xff0c;把robotremoteserver.py文件下载下来&#xff09; 3、首先创建一个目录E:\rfremote\ &a…...

【WSL】Windows 上安装并启动

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

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...