0

0

如何用C++指针操作二维数组 行指针与元素指针转换技巧

P粉602998670

P粉602998670

发布时间:2025-06-28 09:59:01

|

219人浏览过

|

来源于php中文网

原创

理解二维数组内存布局和指针类型差异是关键。二维数组在内存中按行优先连续存储,如int arr3共占12个连续位置;行指针(int ()[4])指向整行,移动跨越一行,元素指针(int)指向单元素,移动仅跨一个元素;转换时,行指针转元素指针可直接取首元素地址,元素指针转行指针需强制类型转换并依赖固定列数;应用上,用元素指针可遍历整个数组,用行指针适合按行处理数据,使用typedef定义行类型可提高代码可读性。掌握这些要点即可灵活操作二维数组与指针转换。

如何用C++指针操作二维数组 行指针与元素指针转换技巧

用C++操作二维数组时,指针的使用非常灵活但也容易让人迷糊。尤其是行指针和元素指针之间的转换,稍不注意就容易出错。其实只要理解了它们的本质,就能轻松应对。

如何用C++指针操作二维数组 行指针与元素指针转换技巧

二维数组在内存中的布局

C++中二维数组本质上是按行优先顺序存储的,也就是说:

如何用C++指针操作二维数组 行指针与元素指针转换技巧
int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

这段代码定义了一个3行4列的二维数组,它在内存中是连续存放的,顺序为:1、2、3、4、5、6、7、8、9、10、11、12。

立即学习C++免费学习笔记(深入)”;

理解这一点很重要,因为不管是用行指针还是元素指针访问,底层数据都是一块连续的内存区域。

如何用C++指针操作二维数组 行指针与元素指针转换技巧

行指针与元素指针的区别

  • 行指针(如 int (*p)[4])指向的是整个一行,每次移动跨越一整行。
  • 元素指针(如 int *p)指向的是单个元素,每次移动只跨一个元素。

举个例子:

int arr[3][4];
int (*rowPtr)[4] = arr;   // 行指针,指向第一行
int *elemPtr = &arr[0][0]; // 元素指针,指向第一个元素

这时如果执行 rowPtr + 1,它会跳到下一行的开头(即 arr[1][0] 的位置),而 elemPtr + 1 只会往后移一个元素的位置。


如何进行行指针与元素指针的转换

从行指针转为元素指针

这一步比较简单,直接取行指针所指行的第一个元素即可:

MagickPen
MagickPen

在线AI英语写作助手,像魔术师一样在几秒钟内写出任何东西。

下载
int (*rowPtr)[4] = arr;
int *elemPtr = *rowPtr; // 等价于 elemPtr = &rowPtr[0][0]

这样你就可以用 elemPtr[i] 来访问所有元素了。

从元素指针转为行指针

这个稍微复杂一点,需要知道每行的列数,并手动计算偏移量:

int *elemPtr = &arr[0][0];
int (*rowPtr)[4] = (int (*)[4])elemPtr;

这样 rowPtr[i][j] 就可以正常访问第 i 行第 j 列的元素了。

注意:这种转换依赖于每行的列数固定,否则无法正确推算地址。

实际应用中的一些技巧

  • 如果你想把二维数组当作一维来处理,可以用元素指针来遍历:

    int *p = &arr[0][0];
    for(int i = 0; i < 3*4; ++i) {
        cout << p[i] << " ";
    }
  • 如果你想按照行来处理数据,比如传给某个函数处理一行数据,那就应该用行指针:

    void processRow(int (*row)[4]) {
        for(int i = 0; i < 4; ++i)
            cout << row[0][i] << " ";
        cout << endl;
    }
  • 使用 typedef 可以让代码更清晰:

    typedef int RowType[4];
    RowType *rowPtr = arr;

基本上就这些。掌握了二维数组在内存中的结构,再结合不同指针类型的移动方式,就能在行指针和元素指针之间自由切换了。虽然看起来有点绕,但多写几次就熟悉了。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

105

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

95

2023.09.26

java进行强制类型转换
java进行强制类型转换

强制类型转换是Java中的一种重要机制,用于将一个数据类型转换为另一个数据类型。想了解更多强制类型转换的相关内容,可以阅读本专题下面的文章。

282

2023.12.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

290

2025.07.15

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

146

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.8万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号