前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >第五章:C++中的数组与指针关系

第五章:C++中的数组与指针关系

作者头像
GeekLiHua
发布于 2025-01-21 08:22:03
发布于 2025-01-21 08:22:03
11800
代码可运行
举报
文章被收录于专栏:JavaJava
运行总次数:0
代码可运行

第五章:C++中的数组与指针关系

C++中的数组与指针关系

在C++中,数组和指针之间有着密切的关系。数组名本身就是一个指向数组首元素的指针,而指针可以用来访问和操作数组元素。本文将深入探讨C++中数组与指针之间的关系,包括指针与一维数组、二维数组之间的转换,并结合丰富的代码示例和实际案例来帮助您更好地理解这个关系。

数组与指针

在C++中,数组名即代表一个指向数组首元素的指针。使用指针可以访问数组元素或进行其他操作。

以下是一个简单的示例,演示了指针如何与一维数组交互:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int numbers[5] = {2, 4, 6, 8, 10};
int* ptr = numbers;

cout << "第一个元素:" << *ptr << endl; // 输出第一个元素:2
cout << "第三个元素:" << *(ptr + 2) << endl; // 输出第三个元素:6

上述代码中,我们创建了一个整数数组numbers并初始化它。然后,声明了一个指向numbers数组首元素的指针ptr。通过*ptr我们可以获取到指针所指向的元素值,通过*(ptr + 2)我们可以获取到指针指向的元素偏移2的值。

我们还可以使用指针来遍历整个数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int* ptr = numbers;
for (int i = 0; i < 5; i++) {
    cout << *ptr << " ";
    ptr++;
}

上述代码中,我们将指针ptr初始化为numbers数组首元素的地址,然后通过递增指针ptr并输出指针所指向的值来遍历整个数组。

指针与一维数组之间的转换

在C++中,数组名可以被解释为指向数组首元素的指针。这种特性使得我们可以使用指针操作数组内容,反之亦然。

以下是一个示例,展示了数组和指针之间的相互转换:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int numbers[] = {2, 4, 6, 8, 10};
int* ptr = numbers;

cout << ptr[0] << endl; // 输出第一个元素:2
cout << numbers[1] << endl; // 输出第二个元素:4

ptr[2] = 12; // 修改第三个元素的值为12
cout << numbers[2] << endl; // 输出修改后的值:12

上述代码中,我们声明了一个整数数组numbers并初始化它。然后,我们声明一个指针ptr并将其设置为numbers数组首元素的地址。接下来,我们通过ptr[0]numbers[1]访问相同的元素。最后,通过ptr[2] = 12修改了第三个元素的值,并通过numbers[2]验证修改结果。

指针与二维数组之间的转换

在C++中,二维数组实际上是连续内存空间的一维数组。通过指针运算,我们可以将二维数组视为一维数组来进行访问和操作。

以下是一个示例,展示了指针如何与二维数组交互:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

int* ptr = &matrix[0][0];

cout << ptr[0] << endl; // 输出第一个元素:1
cout << *(ptr + 5) << endl; // 输出第二行第二个元素:6

上述代码中,我们声明了一个整数二维数组matrix并初始化它。然后,我们使用指针ptr将其设置为matrix数组首元素的地址。通过ptr[0]*(ptr + 5)我们可以访问同样的元素。

实际案例

让我们看一个更复杂的实例,结合指针与二维数组的转换问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int ROWS = 3;
const int COLS = 4;

int matrix[ROWS][COLS];

// 使用指针遍历和填充二维数组
int* ptr = &matrix[0][0];
for (int i = 0; i < ROWS * COLS; i++) {
    *ptr = i;
    ptr++;
}

// 使用指针遍历和输出二维数组
ptr = &matrix[0][0];
for (int i = 0; i < ROWS; i++) {
    for (int j = 0; j < COLS; j++) {
        cout << *ptr << " ";
        ptr++;
    }
    cout << endl;
}

上述代码中,我们使用matrix数组的首元素地址初始化了指针ptr。然后,在一个循环中,我们使用指针来填充整个二维数组。接着,再次使用指针从头到尾遍历并输出整个二维数组。

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0 1 2 3 
4 5 6 7 
8 9 10 11
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
一线运维 DBA 五年经验常用 SQL 大全(二)
本文 SQL 及相关命令均是在运维工作中总结整理而成的,对于运维 DBA 来说可提高很大的工作效率,值得收藏。当然如果你全部能够背下来那就很牛逼了,如果不能,还是建议收藏下来慢慢看,每条 SQL 的使用频率都很高,肯定能够帮助到你。
JiekeXu之路
2021/03/15
9000
一线运维 DBA 五年经验常用 SQL 大全(二)
一线运维 DBA 五年经验常用 SQL 大全(一)
本文 SQL 均是在运维工作中总结整理而成的,对于运维 DBA 来说可提高很大工作效率,当然如果你全部能够背下来那就牛逼了,如果不能,建议收藏下来慢慢看,每条 SQL 的使用频率都很高,肯定能够帮助到你。
JiekeXu之路
2021/02/23
1.5K0
MySQL 故障诊断:MySQL 占用 CPU 过高问题定位及优化
◆ CPU 占用过高常见现象 在使用 MySQL 的过程中会遇到各种瓶颈问题,常见的是 IO 瓶颈,但是有时候会出现服务器 CPU 使用率超过 100%,应用页面访问慢,登录服务器负载很高。而导致这个问题竟然是 MySQL 进程,按理说如果 MySQL 运行稳定,服务器的 CPU 资源并不会跑满,如果出现这个问题,初步可以断定,是 MySQL 实例中出现了问题 SQL。 ◆ CPU 占用过高常见原因 CPU 占用过高常见原因: 服务器硬件问题 内存溢出 业务高并发 如果是业务高并发引起,可以理解为一种业务繁
IT大咖说
2022/05/27
17.6K0
MySQL 故障诊断:MySQL 占用 CPU 过高问题定位及优化
关于MySQL内存泄露如何排查的一些思路
MySQL使用内存上升90%!在运维过程中50%的几率,会碰到这样的问题。算是比较普遍的现象。
数据和云
2021/08/27
2.8K0
关于MySQL内存泄露如何排查的一些思路
Redis中的Big Key问题:排查与解决思路
在处理大型数据时,Redis 作为我们的非关系型数据库经常出现在解决方案之中。然而,在使用 Redis 的过程中,有一些问题可能会悄无声息地影响我们的系统性能,其中最具代表性的就是 Big Key 问题。
BookSea
2023/10/12
5840
使用rdbtools工具来解析redis rdb文件
源码地址:https://github.com/sripathikrishnan/redis-rdb-tools/
SEian.G
2021/03/03
7.5K0
[Oracle 故障处理]记一次undo表空间使用率99%的问题
公司一套11g的RAC undo表空间使用率在99%,一直不会下降,由于我们用的是自动UNDO空间管理,可能的原因可能就是由于会话一直在利用UNDO里面的内容
bsbforever
2020/08/19
3.4K1
[Oracle 故障处理]记一次undo表空间使用率99%的问题
MySQL数据库cpu飙升到500%的话他怎么处理?[通俗易懂]
当 cpu 飙升到 500%时,先用操作系统命令 top 命令观察是不是 mysqld 占用导致的,如果不是,找出占用高的进程,并进行相关处理。
全栈程序员站长
2022/07/11
1.1K0
MySQL数据库cpu飙升到500%的话他怎么处理?[通俗易懂]
一线运维 DBA 五年经验常用 SQL 大全(三)
本文作为常用 SQL 系列的第三篇,本文涉及到的 SQL 及相关命令均是在运维工作中总结整理而成的,对于运维 DBA 来说可提高很大的工作效率,值得收藏下来慢慢看。
JiekeXu之路
2023/02/24
1.4K0
一线运维 DBA 五年经验常用 SQL 大全(三)
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
背景:要迁移数据库,需要创建与源库相同的表空间,大小与源库相同。由于个别表空间较大,手工添加可能需要写很多的脚本,于是同事通过PL/SQL解决了问题。
数据和云
2021/10/13
1.2K0
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
Redis RDB文件离线分析
Redis是一款键值内存数据库,支持丰富的数据类型,在极高的性能下,还支持数据的持久化存储。
用户1082366
2019/02/22
3.7K0
Redis RDB文件离线分析
遇到MDL锁,如何分析和处理?
之前遇到一个DBA,在生产库上加字段,导致数据库连接数打满。原因就是MDL锁引起。下面让我来介绍一下MDL锁及其排查和处理方式。
用户10842762
2023/11/15
6571
Redis 缓存性能实践及总结
在互联网应用中,缓存成为高并发架构的关键组件。这篇博客主要介绍缓存使用的典型场景、实操案例分析、Redis使用规范及常规 Redis 监控。
2020labs小助手
2020/10/12
6450
java应用监控之利用cat接口性能优化
1.用户体验差:接口访问速度慢、如果一个页面打开需要好几秒,用户可能在页面没有完全打开时,就关掉页面离开了,造成用户流失,通过性能优化,减少服务器响应时长,可提高用户体验,较少用户的流失。
用户4361942
2019/05/28
1.6K0
ORACLE常用性能监控SQL【二】
条件为什么block>100,因为一些很小的表,只有几行数据实际大小很小,但是block一次性分配就是5个(11g开始默认一次性分配1M的block大小了,见create table storged的NEXT参数),5个block相对于几行小表数据来说就相差太大了
小小工匠
2021/08/16
4K0
如何优雅的删除一个超过3000多万成员且内存占用超过1.8G的bigkey?
Redis被广泛的应用,得益于它支持高性能访问(微秒级)。作为一个DBA,经常需要去维护bigkey。如果现在业务方需要你去删除一个hash类型的key,且这个key有3000多万个成员,内存占用超过1.8G。如何优雅的删除这个bigkey呢?下面让我来简单的介绍一下。
用户10842762
2023/12/22
4571
如何优雅的删除一个超过3000多万成员且内存占用超过1.8G的bigkey?
MySQL DBA基本知识点梳理和查询优化
本文主要是总结了工作中一些常用的操作,以及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有MySQL基础的开发人员。
数据和云
2019/05/14
9100
Redis详解(6)性能监控:问题分析和优化
尤其redis这类敏感的纯内存、高并发和低延时的服务,一套完善的监控告警方案,是精细化运营的前提。
黄规速
2022/04/14
3.5K0
Redis详解(6)性能监控:问题分析和优化
--如何用PYTHON 定时打印 MYSQL FREE 使用率,与自动创建测试数据库表
源数据库汇中,PYTHON 的使用不是一个可选项,主要在很多地方,监控,处理一些DEVOPS的事情,或者与业务有关的处理的工作都是需要PYTHON 来进行的。下面就用PTYHON 来完成一个很小的打印MYSQL 系统的内存占用率的小脚本来开始 PYTHON travel。(由于是初级水平有待提高,部分代码的有待进步)
AustinDatabases
2020/06/11
1.3K0
你知道 DBA 工作中都要做的巡检有哪些吗?
-------------------------------------------------------------------
JiekeXu之路
2020/04/14
7930
你知道 DBA 工作中都要做的巡检有哪些吗?
推荐阅读
相关推荐
一线运维 DBA 五年经验常用 SQL 大全(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档