C++ 指针数组

news2024/11/16 15:28:41

如果一个数组的每个元素都是指针变量,这个数组就是指针数组。指针数组的每个元素都必须是同一类型的指针。

1.一维指针数组

声明一维指针数组的语法形式:

数据类型*数组名[下标表达式];

下标表达式指出数组元素的个数,数据类型确定每个元素指针的类型,数组名是指针数组的名称,同时也是这个数组的首地址。例如,下列语句:

int *p[3]

声明了一个int类型的指针数组p,其中有3个元素,每个元素都是指向int类型数据的指针。

由于指针数组的每一个元素都是一个指针,必须先赋值在引用,因此声明数组后,对指针元素赋初值是必不可少的。

【例】利用指针数组输出一个3行3列单位矩阵
单位矩阵是主对角线元素为1,其余元素为0的矩阵。

int main()
{
	int a[3] = { 1,0,0 };//定义数组,矩阵第一行
	int b[3] = { 0,1,0 };//定义数组,矩阵第二行
	int c[3] = { 0,0,1 };//定义数组,矩阵第三行
	int* p[3] = { a,b,c };//定义整型指针数组并初始化
	for (int i = 0; i < 3; i++)//对指针数组元素循环
	{
		for (int j = 0; j < 3; j++)//对矩阵每一行进行循环
		{
			cout << p[i][j]<<" ";
			//cout << *(p[i]+j)<<" ";
			
		}
		cout << endl;
	}

	return 0;
}

运行结果:
在这里插入图片描述
结果分析:
在程序中,定义了3个元素的int型指针数组,并在定义的同时用a,b,c三个数组的首地址为这3个元素初始化,使每个元素分别指向矩阵的一行,矩阵的每一行都用一个数组存放,然后通过指针数组的元素访问存放矩阵数据的int型数组。

上述代码中的cout << p[i][j]<<" ";cout << *(p[i]+j)<<" ";等价,即先把指针数组p所存储的第i个指针读出,然后读取它所指向的地址后方的第j个数。它的表示形式上与访问二维数组非常相似,但在具体的访问过程上却不大一样。

2.指针数组与二维数组的区别

二维数组在内存中是以行优先的方式按照一维顺序关系存放的。因此对于一个二维数组,可以理解为一维数组的一维数组,数组名是它的首地址,这个数组的元素个数就是行数,每一个元素是一个一维数组。例如,声明一个int型二维数组:

int arr[3][3]={{1,2,3},{2,3,4},{3,4,5}};

arr[0]是一个长度为3的一维数组,当arr[0]在表达式中出现时,表示一个指向该一维数组首地址的整型指针,这和一维数组的数组名指向该数组的首地址是一样的道理,所以可以用*(arr[0])来表示arr[0][0],用*(arr[0]+1)来表示arr[0][1]。上例中的p[i][j]与这里的arr[i][j]的不同之处在于,对于p来说,p[i]的值需要通过读取指针数组p的第i个元素才能得到,而arr[i]的值是通过二维数组arr的首地址计算得到的,内存中并没有一个指针数组来存储arr[i]的值。如下图所示:
在这里插入图片描述

尽管指针数组与二维数组存在本质上的差异,但二者具有相同的访问形式,可以把二维数组当作指针数组来访问。

【例】二维数组举例

int main()
{
	int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << *(*(arr+i)+j) << "  ";//逐个输出二维数组第i行的元素
		}
		cout << endl;
	}
	return 0;
}

运行结果:
在这里插入图片描述
通过数组元素的地址可以输出二维数组的元素:形式如下:

*(*(arr+i)+j)

这就是arr数组的第i行j列元素,对应使用下标表示的arr[i][j]

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

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

相关文章

【雕爷学编程】MicroPython动手做(29)——物联网之SIoT

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

浙大数据结构第六周之06-图3 六度空间

题目详情&#xff1a; “六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一…

动手学深度学习—卷积神经网络(原理解释+代码详解)

目录 1. 从全连接层到卷积层2. 图像卷积2.1 互相关运算2.2 卷积层2.3 图像中目标的边缘检测2.4 学习卷积核2.5 特征映射和感受野 3. 填充和步幅3.1 填充3.2 步幅 4. 多输入多输出通道4.1 多输入通道4.2 多输出通道4.3 11卷积核 5. 汇聚层5.1 最大汇聚层和平均汇聚层5.2 填充和步…

Stable Diffusion - SDXL 模型测试 (DreamShaper 和 GuoFeng v4) 与全身图像参数配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132085757 图像来源于 GuoFeng v4 XL 模型&#xff0c;艺术风格是赛博朋克、漫画、奇幻。 全身图像是指拍摄对象的整个身体都在画面中的照片&…

Bean的实例化方法

目录 1.工厂模式通常有三种形态&#xff1a; 2.简单工厂 2.1 静态工厂 2.1通过factory-bean实例化 2.3通过FactoryBean接口实例化 3.测试 关于容器的使用 3.1获得spring文件方式 3.2getBean方式 4.关闭容器 1.工厂模式通常有三种&#xff1a; 第一种&#xff1a;简单工…

二叉树题目:叶子相似的树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;叶子相似的树 出处&#xff1a;872. 叶子相似的树 难度 3 级 题目描述 要求 考虑一个二叉树上所有的叶子&…

消息队列项目(1)

概念 这里的消息队列, 大致上就是一个生产者消费者模型. 我这个消息队列是仿照 RabbitMQ 的实现原理来进行编写的 需求分析 有几个核心的概念: 生产者(Producer)消费者(Consumer)中间人(Broker)发布(Publish) :生产者向中间人投递消息的过程订阅(Subcribe) :记录哪些消费者…

Java面试题 如何提高自己的算法?

练习一&#xff1a;飞机票 需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来年4月&a…

【Java可执行命令】(十五)Java进程状态信息获取工具 jps:获取和监控Java进程的状态信息 ~

Java可执行命令之jps 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 可选参数&#xff1a;-q3.3 可选参数&#xff1a;-m3.4 可选参数&#xff1a;-l3.5 可选参数&#xff1a;-v3.6 可选参数&#xff1a;-V 4️⃣ 应用场景&#x1f33e; 总结 1️⃣ 概念 JPS&#xff…

【BEV感知】1-BEV感知算法介绍

1-BEV感知算法介绍 1 什么是BEV感知算法&#xff1f;1.1 什么是BEV&#xff1f;1.2 什么是感知&#xff1f;1.3 什么是算法&#xff1f;1.4 什么是BEV感知&#xff1f; 1 什么是BEV感知算法&#xff1f; 1.1 什么是BEV&#xff1f; Bird’s-Eye-View&#xff0c;尺度变化小、…

客户端电脑使用 FTP的Cadence_CIS库方法说明 (下)

简介&#xff1a;随着企业的规模扩大&#xff0c;硬件工程师的增多&#xff0c;使用统一服务器上的库管理&#xff0c;可以减少设计错误&#xff0c;提高效率。 使用在FTP上布局Cadence_CIS库&#xff0c;是目前的主流的做法之一&#xff1b; 本文方法&#xff0c;用于已经配置…

【网络基础进阶之路】一文弄懂TCP的三次握手与四次断开

系列文章&#xff1a; 【网络基础进阶之路】路由器间的静态综合详解 文章目录&#xff1a; 一、TCP协议 二、三次握手——建立连接 三、四次断开——结束连接 一、TCP协议 TCP是一种面向广域网的通信协议&#xff0c;目的是在跨越多个网络通信时&#xff0c;为两个通信端…

如何利用闭环思维解决企业营销问题

彼得圣吉在他的畅销书《第五项修炼》一书中主要介绍了“系统思考”的第五项修炼&#xff0c;系统思考的方法有三个基本元件&#xff1a;不断增强的回馈&#xff0c;反复调节的回馈&#xff0c;和时间滞延。其不断增强的回馈其实就是增强闭环理论&#xff0c;其在企业管理中有很…

嘿嘿嘿~卷王来喽~今天我被卷s了,谁也白想活zhuo!

前言 嘿嘿嘿~热乎乎的卷王来喽&#xff0c;卷呀&#xff01;你们怎么不卷&#xff01;&#xff08;啪&#xff01;电脑一合&#xff09;&#xff0c;好&#xff01;今天&#xff0c;我卷了&#xff0c;我得卷s&#xff0c;但是&#xff01;我被卷了&#xff0c;你们也白想活着…

极狐GitLab 10 年开源研发管理实践:4 个核心步骤突破效能瓶颈

目录 研发效能实践的痛点 4 步击破痛点&#xff0c;提升研发效能 1. 明确目标 2. 优化研发流程 ➤ 2.1 文档先行 ➤ 2.2 可追踪的任务 ➤ 2.3 自动化工作流 3. 注重代码质量 ➤ 3.1 代码门禁&#xff1a;严格要求&#xff0c;提前报错 ➤ 3.2 合并请求&#xff1a;代…

Netty 入门指南

文章目录 前言Netty介绍Netty发展历程Netty核心组件实现HTTP服务器总结 前言 上文《BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程》介绍了几种IO模型以及Java NIO&#xff0c;了解了在网络编程时使用哪种模型可以提高系统性能及效率。即使Java NIO可以帮助开发人员…

【java】【maven】【高级】MAVEN聚合继承属性等

目录 1、模块开发与设计 2、聚合 2、继承 3、属性 4、版本管理 5、资源配置 6、多环境配置 7、多环境开发配置 8、跳过测试 9、私服 前言&#xff1a;maven的高级使用包含分模块开发与设计、聚合、继承、属性、版本管理、资源配置、多环境配置、多环境开发配置、跳过…

软件测试缺陷报告

缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report&#xff08;SBR&#xff09;或软件问题报告Software Problem Report&#xff08;SPR&#xff09; 作用&#xff1a;缺陷报告是软件测试人员的工作成果之一&#xff0c;体现软件测试的价值缺陷报…

如何知道企业是否办理过等保备案?哪里可以查询?

对于等保政策细节&#xff0c;大家还存在很多疑问&#xff0c;例如有人在问&#xff0c;如何知道企业是否办理过等保备案&#xff1f;哪里可以查询&#xff1f;今天我们就来简单聊聊&#xff0c;仅供参考。 如何知道企业是否办理过等保备案&#xff1f; 一般企业办理过等保备案…

RISC-V基础指令之shift移动指令slli、srli、srai、sll、srl、sra

RISC-V的shift指令是用于对一个寄存器或一个立即数进行位移运算&#xff0c;并将结果存放在另一个寄存器中的指令。位移运算就是把一个操作数的每一位向左或向右移动一定的位数&#xff0c;得到一个新的位。RISC-V的shift指令有以下几种&#xff1a; slli&#xff1a;左逻辑位…