[原创](Modern C++)现代C++的关键性概念: 如何利用多维数组的指针安全地遍历所有元素

news2025/4/3 4:17:11

[作者]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、
开发工具: Visual Studio、Delphi、XCode、C++ Builder、Eclipse
技能种类: 逆向 驱动 磁盘 文件 大数据分析
涉及领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 股票模型量化/磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
专注研究: 机器学习、股票模型量化、金融分析

[序言]
在现代C++编程中, 多维数组的指针操作是一个既基础又关键的概念. 对于需要高效处理数据的场景, 正确使用指针遍历多维数组可以显著提升代码性能, 同时保持良好的可读性和安全性. 然而, 指针操作的复杂性也容易感到困惑, 特别是在边界管理和类型转换上. 

[代码演示]

int main() {

	_setmode(_fileno(stdout), _O_WTEXT);

	// 初始化两个3x4的二维数组, 用于演示.
	int int_MArray_A[3][4] = {
		{1, 2, 3, 4},
		{5, 6, 7, 8},
		{9, 10, 11, 12}
	};

	// pointer_Row 是指向含有4个整数的数组.
	// 即 int_MArray_A 的行指针, 初始指向第一行
	int (*pointer_Row)[4] = int_MArray_A;

	// 将 pointer_Row 指向 int_MArray_A 的最后一行
	pointer_Row = &int_MArray_A[2];

	std::wstring wstr_AllVal{ L"" };
    // 方式1: 手动管理指针遍历多维数组
    // 注意: *auto_pointer_Row 表示多维数组的某一行, *auto_pointer_Row 会被自动转换为指向该行首元素的指针
	// 因此可以用 *auto_pointer_Row + 1, *auto_pointer_Row + 2 ... 这样方式来遍历行内的元素
	for (auto auto_pointer_Row = int_MArray_A;
		auto_pointer_Row != int_MArray_A + 3;
		++auto_pointer_Row)
	{
		for (auto auto_pointer_Col = *auto_pointer_Row;
			auto_pointer_Col != *auto_pointer_Row + 4;
			++auto_pointer_Col)
		{
			wstr_AllVal += std::to_wstring(*auto_pointer_Col);
			wstr_AllVal += L" ";
		}
	}

	// 方式2: 利用 std::begin 和 std::end 简化遍历
	wstr_AllVal = L"";
	for (auto auto_pointer_Row = std::cbegin(int_MArray_A);
		auto_pointer_Row != std::cend(int_MArray_A);
		++auto_pointer_Row)
	{
		for (auto auto_pointer_Col = std::cbegin(*auto_pointer_Row);
			auto_pointer_Col != std::cend(*auto_pointer_Row);
			++auto_pointer_Col)
		{
			wstr_AllVal += std::to_wstring(*auto_pointer_Col);
			wstr_AllVal += L" ";
		}
	}

	std::cin.get();

	return 0;
}

[代码说明]
1. 行指针的定义与操作:
   * int (*pointer_Row)[4]是一个指向含有4个整数的数组的指针, 用于表示int_MArray_A的某一行.
   * 初始时, pointer_Row指向数组的第一行(即int_MArray_A). 随后, 将其重定向到最后一行(&int_MArray_A[2]), 展示了指针可以灵活地定位到任意一行.

2. 遍历多维数组的两种方法:
   * 方式1: 手动管理指针:
     * 外层循环使用auto_pointer_Row从int_MArray_A的起始地址遍历到结束地址(int_MArray_A + 3), 每次递增一行.
     * 内层循环通过*auto_pointer_Row获取当前行的首元素指针, 然后用auto_pointer_Col遍历该行的每个元素(从*auto_pointer_Row到*auto_pointer_Row + 4).

  * 方式2: 利用std::begin和std::end:
    * 外层循环使用std::cbegin(int_MArray_A)和std::cend(int_MArray_A)获取数组的起始和结束迭代器, 无需手动指定行数.
    * 内层循环对每一行使用std::cbegin(*auto_pointer_Row)和std::cend(*auto_pointer_Row)获取该行的迭代器范围.
    * 这种方法利用标准库提供的工具, 自动处理边界, 代码更简洁且更安全, 是现代C++推荐的做法.

[总结]
通过对比两种遍历方式, 可以看到现代C++在保留指针灵活性的同时, 通过标准库提供了更优雅的解决方案. 对于实际开发, 建议优先使用std::begin和std::end等工具, 以减少错误并提升代码质量.

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

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

相关文章

【Elasticsearch基础】基本核心概念介绍

Elasticsearch作为当前最流行的分布式搜索和分析引擎,其强大的功能背后是一套精心设计的核心概念体系。本文将深入解析Elasticsearch的五大核心概念,帮助开发者构建坚实的技术基础,并为高效使用ES提供理论支撑。 1 索引(Index&…

Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!

【今日推荐】超强AI工具库"awesome-mcp-servers"星数破万! ① 百宝箱式服务模块:AI能直接操作浏览器、读文件、连数据库,比如让AI助手自动整理Excel表格,三分钟搞定全天报表; ② 跨领域实战利器:…

SpringMVC 拦截器(Interceptor)

一.拦截器 假设有这么一个场景,一个系统需要用户登录才能进入,在检验完用户的信息后对页面进行了跳转。但是如果我们直接输入跳转的url,可以绕过用户信息校验(用户登录),直接进入系统。 因此我们引入了使…

03-SpringBoot3入门-配置文件(自定义配置及读取)

1、自定义配置 # 自定义配置 zbj:user:username: rootpassword: 123456# 自定义集合gfs:- a- b- c2、读取 1)User类 package com.sgu.pojo;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.spring…

【蓝桥杯每日一题】3.28

🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x "今天熬的夜,会变成明天奖状的闪光点!" 目录 一、唯一的雪花 题目链接 题目描述 解题思路 解题代码 二、逛画展 题目链接 题目描述 解题思路 解题代…

万字长文详解Text-to-SQL

什么是Text-to-SQL 在各个企业数据量暴涨的现在,Text-to-SQL越来越重要了,所以今天就来聊聊Text-to-SQL。 Text-to-SQL是一种将自然语言查询转换为数据库查询的技术。它可以让用户通过自然语言来查询数据库,而不需要编写复杂的SQL语句。 T…

【Linux】动静态库的制作与使用

一.对软硬链接的补充 1、无法对目录进行硬链接 为什么呢? 首先,我们在访问文件时,每一个文件都会有自己的dentry结构,这些结构会在内存中维护一棵路径树,来快速进行路径查找。但是如果某个节点直接使用硬链接到了根节…

ubuntu22.04 如何安装 ch341 驱动

前言 本篇是介绍ubuntu22.04如何安装 ch341 驱动,并对其中遇到的问题进行整理。 一、流程 1.1 查看CH340驱动 首先是查看ubuntu22.04系统自带的驱动,用以下命令即可 ls /lib/modules/$(uname -r)/kernel/drivers/usb/serial 然后会跳出以下界面&…

个人博客网站从搭建到上线教程

步骤1:设计个人网站 设计个人博客网站的风格样式,可以在各个模板网站上多浏览浏览,以便有更多设计网站风格样式的经验。 设计个人博客网站的内容,你希望你的网站包含哪些内容如你的个人基本信息介绍、你想分享的项目、你想分享的技术文档等等。 步骤2:选择开发技术栈 因…

mac m4 Homebrew安装MySQL 8.0

1.使用Homebrew安装MySQL8 在终端中输入以下命令来安装MySQL8: brew install mysql8.0 安装完成后,您可以通过以下命令来验证MySQL是否已成功安装: 2.配置mysql环境变量 find / -name mysql 2>/dev/null #找到mysql的安装位置 cd /op…

UE5学习笔记 FPS游戏制作26 UE中的UI

文章目录 几个概念创建一个UI蓝图添加UI获取UI的引用 切换设计器和UI蓝图将UI添加到游戏场景锚点轴点slotSizeToContent三种UI数据更新方式(Text、Image)函数绑定属性绑定事件绑定 九宫格分割图片按钮设置图片绑定按下事件 下拉框创建添加数据修改样式常用函数 滚动框创建添加数…

Navicat导出mysql数据库表结构说明到excel、word,单表导出方式记录

目前只找到一张一张表导出的方式 使用information_schema传入表名查询 字段名根据需要自行删减,一般保留序号、字段名、类型、说明就行 SELECT COLUMNS.ORDINAL_POSITION AS 序号, COLUMNS.COLUMN_NAME AS 字段名, COLUMNS.COLUMN_TYPE AS 类型(长度), COLUMNS.N…

Linux驱动开发 中断处理

目录 序言 1.中断的概念 2.如何使用中断 中断处理流程 中断上下文限制 屏蔽中断/使能 关键区别与选择 上半部中断 下半部中断 软中断(SoftIRQ) 小任务(Tasklet) 工作队列(Workqueue) 线程 IRQ(Threaded IRQ…

Centos主机检查脚本

使用方法: 将脚本保存为 CentOS_syscheck.sh 添加执行权限: chmod x CentOS_syscheck.sh 执行脚本: ./CentOS_syscheck.sh #!/bin/bash# 设置颜色变量 RED\033[0;31m GREEN\033[0;32m YELLOW\033[0;33m BLUE\033[0;34m NC\033[0m # 重置…

python系统之综合案例:用python打造智能诗词生成助手

不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。 python系列之综合案例 前言一、项目描述二、项目需求三、 项目实现1、开发准备2、代码实现 …

23种设计模式-结构型模式-桥接器

文章目录 简介问题解决方案示例总结 简介 桥接器是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。 问题 假如你有一个几何形状Shape类,它有两个子类:圆形C…

K8S学习之基础五十八:部署nexus服务

部署nexus服务 Nexus服务器是一个代码包管理的服务器,可以理解 Nexus 服务器是一个巨大的 Library 仓库。Nexus 可以支持管理的工具包括 Maven , npm 等,对于 JAVA 开发来说,只要用到 Maven 管理就可以了。Nexus服务器作用&#x…

Docker Desktop 界面功能介绍

Docker Desktop 界面功能介绍 左侧导航栏 Containers(容器): 用于管理容器,包括查看运行中或已停止的容器,检查容器状态、日志,执行容器内命令,启动、停止、删除容器等操作。Images(镜像): 管理本地 Docker 镜像,可查看镜像列表、从 Docker Hub 拉取新镜像、删除镜…

C++ set map

1.set和map是什么 set和map是 C STL 提供的容器,用于高效的查找数据,底层采用红黑树实现,其中set是Key模型,map是Key-Value模型 set和map的基本使用较为简单,这里不再叙述,直接进入实现环节 2.set和map的…

Spring AI Alibaba 对话记忆使用

一、对话记忆 (ChatMemory)简介 1、对话记忆介绍 ”大模型的对话记忆”这一概念,根植于人工智能与自然语言处理领域,特别是针对具有深度学习能力的大型语言模型而言,它指的是模型在与用户进行交互式对话过程中,能够追踪、理解并利…