黑icp 网站建设/seo免费教程
文章目录
- 一、指针数组 和 数组指针
- ① 数组指针
- ② 指针数组
- 二、函数指针与函数指针数组
- ① 函数指针
- ② 函数指针数组
- 三、指针与一维、二维数组
- ① 指针与一维数组
- ② 指针与二维数组
一、指针数组 和 数组指针
① 数组指针
数组指针(Array Pointer)是指向数组的指针变量,也可以理解为一维数组与指针的结合。其定义形式为:
type (*ptr)[size]; // 记法:数组指针本身是指针,所以需要括号将*与指针变量括起来
其中,
type
表示数组元素的数据类型,ptr
是指向数组的指针变量,size 是数组的长度。
例如:
arr[5] = { 1, 2, 3, 4, 5 };
int (*p)[5] = &arr; // 定义一个指向长度为 5 的 int 类型数组的指针
上述代码中,
p
是一个指向长度为5
的 int类型数组的指针,指向 arr 数组的首地址。
通过数组指针可以访问数组中的元素。
例如:
(*p)[0] = 10; // 修改 arr 数组的第一个元素为 10
需要注意的是,在使用数组指针访问数组元素时,需要使用 (*p)[i] 的形式。
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
② 指针数组
指针数组(pointer array) 是一个数组,其元素都是指针变量。其定义形式为:
type *ptr[size]; // 指针数组本身是数组,每个元素是指针变量,故不加括号([] 优先级高于 *)
其中,
type
表示指针变量所指向的数据类型,ptr
是指针数组,size
是数组的长度。
例如:
int a = 1, b = 2, c = 3;
int *ptr[3] = { &a, &b, &c }; // 定义一个包含三个 int 类型指针变量的数组
上述代码中,ptr 是一个包含三个 int 类型指针变量的数组,分别指向 a、b、c 三个变量。
通过指针数组可以访问指向的变量。例如:
*ptr[0] = 10; // 修改 a 变量的值为 10
需要注意的是,在使用指针数组访问指针变量所指向的数据时,需要使用
*ptr[i]
的形式。
综上所述,数组指针和指针数组是两个不同的概念,使用时需要根据实际情况选择合适的方式。
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
二、函数指针与函数指针数组
① 函数指针
函数指针(Function Pointer) 是指向函数的指针变量。它可以用来存储和调用函数的地址,实现对函数的动态调用。函数指针的类型必须与所指向的函数的类型一致,包括返回值类型和参数列表。
声明函数指针的格式如下:
return_type (*pointer_name)(params);
其中,return_type
是函数的返回值类型,pointer_name
是函数指针的名称,params
是函数的参数列表。
以下是一个简单的示例,展示了如何声明、赋值和调用函数指针:
#include <iostream>int add(int a, int b) {return a + b;
}int main() {int (*ptr)(int, int) = add; // 声明一个函数指针 ptr,并将其赋值为函数 add 的地址ptr(); // 调用函数指针 ptr,相当于调用函数addreturn 0;
}
在上述代码中,声明了一个函数指针 ptr,它指向无返回值且无参数的函数 add。然后将函数 add 的地址赋值给 ptr,最后通过 ptr() 调用了函数 add。
函数指针在许多情况下非常有用,例如在 回调函数、函数指针数组、函数指针作为函数参数 等场景中都能发挥重要作用。通过函数指针,可以实现函数的灵活调用与动态选择。
② 函数指针数组
函数指针数组(Array of Function Pointers)是一个包含函数指针元素的数组。每个数组元素都是一个函数指针,它们可以指向不同的函数。通过函数指针数组,可以实现对不同函数的动态调用和选择。
声明函数指针数组的格式如下:
return_type (*array_name[size])(params);
以下是一个简单的示例,展示了如何声明、赋值和调用函数指针数组:
#include <iostream>int mul(int a, int b) {return a * b;
}int div(int a, int b) {return a / b;
}int main() {int (*ptrArr[2])() = {mul, div}; // 声明一个包含 2 个函数指针元素的函数指针数组,并将其赋值为函数 mul 和函数 div 的地址for (int i = 0; i < 2; i++) {ptrArr[i](); // 调用函数指针数组中的函数指针}return 0;
}
在上述代码中,声明了一个函数指针数组
ptrArr
,它包含了两个函数指针元素。第一个元素指向函数mul
,第二个元素指向函数div
。通过遍历函数指针数组,逐个调用函数指针,实现了对函数的动态调用。
如果我们要使用switch语句来进行堆函数的调用,可以替换为函数指针数组。
函数指针数组在一些场景中非常有用,例如函数回调、状态机等。通过函数指针数组,可以根据需要灵活地选择和调用不同的函数,使程序具有更高的可扩展性和灵活性。
三、指针与一维、二维数组
① 指针与一维数组
指针与一维数组在 C/C++ 中有紧密的关联,并可以相互转换。
- 数组名作为指针
在 C/C++ 中,数组名可以被看作是指向数组首元素的指针。
例如:
int arr[5] = { 1, 2, 3, 4, 5 };
int *ptr = arr; // 数组名 arr 被隐式地转换为指向数组首元素的指针
上述代码中,
ptr
是一个指向整型变量的指针,它被赋值为数组arr
的首地址。此时,可以通过指针ptr
访问数组中的元素,例如ptr[0]
表示数组arr
的第一个元素。
需要注意的是,虽然数组名可以被看作指针,但它并不是一个普通的指针变量,无法进行赋值操作或修改其值。
- 指针数组和一维数组的转换
指针数组和一维数组可以相互转换。例如:
- 将指针数组转换为一维数组:
int a = 1, b = 2, c = 3;
int *ptr[3] = { &a, &b, &c }; // 定义一个指针数组
int arr[3] = { *ptr[0], *ptr[1], *ptr[2] }; // 将指针数组转换为一维数组
上述代码中,通过 解引用指针数组的元素,可以获取指针所指向的值,然后将这些值赋给一维数组。
- 将一维数组转换为指针数组:
int arr[3] = { 1, 2, 3 };
int *ptr[3];for (int i = 0; i < 3; i++) {ptr[i] = &arr[i];
}
上述代码中,通过循环遍历一维数组,可以将数组中每个元素的地址存储到指针数组中,从而实现一维数组到指针数组的转换。
总结:指针与一维数组之间存在紧密的关系,并可以相互转换。通过理解和灵活运用指针与一维数组的特性,可以更自由地操作和处理数组数据。
② 指针与二维数组
指针与二维数组在 C/C++ 中也有一定的关联,并可以相互转换。
- 指针与二维数组的关系
对于二维数组,可以使用指针来进行访问和操作。我们知道,二维数组实际上是由多个一维数组组成的,每个一维数组都是连续存储的。
int arr[][3] = { {1, 2, 3}, {4, 5, 6} };
int (*ptr)[3] = arr; // 使用指针指向二维数组的首地址
上述代码中,
ptr
是一个指向包含3个整数的一维数组的指针。它被赋值为二维数组 arr 的首地址。通过指针 ptr 可以访问二维数组中的元素,例如
ptr[i][j]
表示二维数组 arr 中第 i 行、第 j 列的元素值。
需要注意的是,在使用指针访问二维数组时,需要使用 (*ptr)[j]
的形式。
- 指针与二维数组的转换
指针与二维数组也可以相互转换。
例如:
- 将指针转换为二维数组:
可以通过将指针转换为二维数组来进行操作和访问。
int (*ptr)[3] = new int[2][3]; // 动态分配一个二维数组
int arr[2][3] = *ptr; // 将指针转换为二维数组
上述代码中,通过使用 new 运算符动态分配一个二维数组,并将其赋给指针 ptr。然后,通过解引用指针,将指针转换为二维数组。
- 将二维数组转换为指针:
可以通过将二维数组转换为指针来实现某些操作和传递给函数。
int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };
int (*ptr)[3] = arr; // 将二维数组转换为指针
上述代码中,将二维数组 arr 赋给指针
ptr
,这样就将二维数组转换为指针。
总结:指针与二维数组之间有一定的关联,并可以相互转换。通过理解和灵活运用指针与二维数组的特性,可以更自由地操作和处理二维数组数据。
相关文章:

C指针与一维二维数组、数组指针与指针数组、函数指针_数组的理解使用
文章目录 一、指针数组 和 数组指针① 数组指针② 指针数组 二、函数指针与函数指针数组① 函数指针② 函数指针数组 三、指针与一维、二维数组① 指针与一维数组② 指针与二维数组 一、指针数组 和 数组指针 ① 数组指针 数组指针(Array Pointer)是指…...

安装运行vue-element-admin的报错问题-解决办法
文章目录 1.第一处2.第二处3.安装运行 在使用vue-element-admin时,使用命令安装: npm install -registryhttps://registry.npm.taobao.org会报错,不通过。需要修改两处。 1.第一处 在目录vue-element-admin-master\src\components\Markdown…...

高数笔记03:几何、物理应用
图源:文心一言 本文是我学习高等数学几何、物理应用的一些笔记和心得,希望可以与考研路上的小伙伴一起努力上岸~~🥝🥝 第1版:查资料、画导图~🧩🧩 参考资料:《高等数学 基础篇》武…...

js + selenium 获取chatgpt的accessToken
chatgpt的accessToken非常有用,在做web api对接时,因为登录超时 会刷新accessToken let elements document.querySelectorAll(.token-string);let concatenatedText [8,9,10].map(index > {return elements[index] ? elements[index].textContent …...

Spring MVC 十一:中文乱码
SpringMVC的中文乱码问题其实已经不是什么问题了,无非就是配置编码方式->解决问题。 但是由于SpringMVC可以通过:xml方式配置、Servlet3.0方式配置,以及是否使用EnableWebMvc等,不同配置方式下,解决中文乱码问题的…...

Excel恢复科学技术法显示的数据
Excel中输入位数较大的数据时,软件会自动使用科学计数法显示。很多时候并不需要这样的计数格式,所以需要把它转变为普通的数字格式 操作方法 选中单元格/列/行》右键》设置单元格式 在打开的窗口中,切换到“数字”选项卡,点击“自…...

springboot 志同道合交友网站演示
springboot 志同道合交友网站演示 liu1113625581...

如何理解BFC、开启BFC、BFC解决哪些问题
1.BFC 概念 BFC 英文名为 Block Formatting Context (块级格式化上下文) 具体可查看 MDN 2.BFC的作用 元素开启BFC后,子元素不会发生margin塌陷问题元素开启BFC后,子元素浮动,元素不发生高度塌陷元素开启BFC后,该元素不被其他元…...

3D包容盒子
原理简述 包围体(包容盒)是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包…...

用 Three.js 创建一个酷炫且真实的地球
接下来我会分步骤讲解,在线示例在数字孪生平台。 先添加一个球体 我们用threejs中的SphereGeometry来创建球体,给他贴一张地球纹理。 let earthGeo new THREE.SphereGeometry(10, 64, 64) let earthMat new THREE.MeshStandardMaterial({map: albed…...

【数据结构】线性表与顺序表
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 线性表与顺序表 1. 线性表2. 顺序表2.1 …...

ChatGPT
chatgpt使用地址 https://mycaht.top/#/chat 申请内测免费key https://github.com/chatanywhere/GPT_API_free 设置 接口地址设置改成 https://api.chatanywhere.com.cnAPI Key设置成申请出来的免费key 开始聊天...

矿区井下智慧用电安全监测解决方案
一、背景 矿区井下作业具有复杂的环境和较高的危险性,对于用电安全的要求尤为严格。传统的管理模式和监测方法往往无法实时、准确地掌握井下用电情况,对安全隐患的排查与预防存在一定局限性。因此,引入智慧用电安全监测解决方案ÿ…...

网站列表页加密:三次请求后返回内容多\r
一、抓包第一次请求 url aHR0cDovL2N5eHcuY24vQ29sdW1uLmFzcHg/Y29saWQ9MTA抓包,需要清理浏览器cookie,或者无痕模式打开网址,否则返回的包不全,依照下图中的第一个包进行requests请求 第一次请求后返回 <!DOCTYPE html>…...

12.JVM
一.JVM类加载机制:把类从硬盘文件加载到内存中 1.java文件,编写时是一个.java文件,编译后现成一个.class的字节码文件,运行的时候,JVM就会读取.class文件,放到内存中,并且构造类对象. 2.类加载流程: a.加载:找到.class文件,打开文件,读取内容,尝试解析文件内容. b.验证:检查…...

关于网络协议的若干问题(四)
1、QUIC 是一个精巧的协议,它有哪些特性? 答:QUIC 还有其他特性,一个是快速建立连接。另一个是拥塞控制,QUIC 协议当前默认使用了 TCP 协议的 CUBIC(拥塞控制算法)。 CUBIC 进行了不同的设计&…...

opencv图像卷积操作和常用的图像滤波函数
文章目录 opencv图像卷积操作原理,opencv中常用的图像滤波函数一、图像卷积操作原理:1、卷积操作原理图: 二、opencv常用的图像滤波函数:这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声࿰…...

习题1. 31
话不多说 先上代码 (defn product [ term a nxt b](defn iter [a result](if (> a b)1 (* (term a) (iter (nxt a) result))))(iter a 1)) 跟习题1.30比较起来,就是两个地方不同 乘法不能乘0 必须是1。难度来讲,跟1.30难度是一样的。增加了迭代过…...

见微知著:从企业售后技术支持看云计算发展
作者:余凯 售后业务中的细微变化 作为阿里云企业容器技术支持的一员,每天会面对全球各地企业级客户提出的关于容器的各种问题,通过这几年的技术支持的经历,逐步发现容器问题客户的一些惯性,哪些是重度用户࿰…...

C++笔记之如何给 `const char*` 类型变量赋值
C笔记之如何给 const char* 类型变量赋值 code review! 文章目录 C笔记之如何给 const char* 类型变量赋值1.在C中,如果你要给一个 const char* 变量赋值,你通常有几种方法来做这件事,具体取决于你的需求。下面是一些常见的方法:…...

9.Linear Maps
线性映射 线性映射是将向量作为输入并产生一些新向量作为输出的转换。 从坐标定义开始(数组),再到2,3,并展示它们是如何关联的 线性映射的坐标表示最终是矩阵, 1.坐标定义(数组) 列向量是向量的坐标表示…...

大数据Doris(十):添加BE步骤
文章目录 添加BE步骤 一、使用mysql连接 二、添加be...

Vue2 +Element UI 表格行合并
如果相邻数据是一致的,则单元格的行合并,指定需要合并的列,下面我是指定合并了分类和类型这两列。 先看效果 Element UI为我们的<el-table>提供了一个属性span-method:合并行或列的计算方法 下面是一个示例: html部分 - 主要是在表上指…...

SuperEdge易学易用系列-一键搭建SuperEdge集群
条件说明: 系统 公网IP 内网IP 服务器所在地 K8S版本 Centos7.9 114.116.101.254 192.168.0.245 北京 v1.22.6 Centos7.9 119.8.1.96 192.168.0.83 香港 v1.22.6 Ubuntu22 94.74.108.152 192.168.0.154 纽约 v1.22.6 1. 开始部署 1.1 两条指令从零搭建一个边缘集…...

农场养殖农产品商城小程序搭建
鸡鸭羊牛鱼养殖用户不少,其规模也有大有小,尤其对一些生态养殖企业,其产品需求度更高,同时他们也有实际的销售需求。 由于具备较为稳定的货源,因此大规模多规格销售属性很足。 通过【雨科】平台搭建农场养殖商城&…...

大语言模型之十七-QA-LoRA
由于基座模型通常需要海量的数据和算力内存,这一巨大的成本往往只有巨头公司会投入,所以一些优秀的大语言模型要么是大公司开源的,要么是背后有大公司身影公司开源的,如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的…...

UML组件图综合指南:设计清晰、可维护的软件系统
介绍: UML(Unified Modeling Language)组件图是软件系统设计中的重要工具,用于描绘系统的物理结构和组件之间的关系。在软件工程中,通过创建清晰的组件图,团队能够更好地理解系统的模块化结构和组织关系&a…...

深入浅出ThreadPoolExecutor(一)
文章目录 线程池简诉ThreadPoolExecutor详解ThreadPoolExecutor参数详解创建线程池的工具类Executors 线程池简诉 针对各种池子,比如 连接池:用于管理和重复使用数据库连接,避免频繁创建和销毁数据库连接带来的性能开销。对象池:用于管理和重复使用对象…...

网站的常见攻击与防护方法
在互联网时代,几乎每个网站都存在着潜在的安全威胁。这些威胁可能来自人为失误,也可能源自网络犯罪团伙所发起的复杂攻击。无论攻击的本质如何,网络攻击者的主要动机通常是谋求经济利益。这意味着无论您经营的是电子商务项目还是小型商业网站…...

网络工程师知识点3
41、各个路由协议,在华为设备中的优先级? 直连路由 0 OSPF 10 静态 60 42、OSPF:开放式最短路径优先路由协议,使用SPF算法发现和计算路由 OSPF的优点: 1、收敛速度快,无路由自环,适用于大型网络…...