首页 > 解决方案 > 如何通过 C++ 中的指针循环遍历多维数组

问题描述

循环遍历一个简单的数组是没有问题的,但是使用指针循环遍历多维数组的正确方法是什么?

#include <iostream>

int main(int argc, char* argv[])
{
    int data1[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};

    for(auto *p = data1; p!=data1+9; ++p)
    {
        std::cout << (*p) << ' ';
    }
    std::cout << std::endl;


    int data2[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

    for(auto *lineP = data2; lineP!=data2+3; ++lineP)
    {
        for(auto *p = &(lineP[0]); p!= &(lineP[3]); ++p)
        {
            std::cout << (*p) << ' ';
        }
        std::cout << std::endl;
    }
}

在这里data1循环正确地产生预期的输出。但是data2循环在某些方面是错误的,因为输出不是元素的值,而是地址。

示例输出:

1 2 3 4 5 6 7 8 9 
0x7ffde45b77a0 0x7ffde45b77ac 0x7ffde45b77b8 
0x7ffde45b77ac 0x7ffde45b77b8 0x7ffde45b77c4 
0x7ffde45b77b8 0x7ffde45b77c4 0x7ffde45b77d0 

标签: c++arraysfor-looppointers

解决方案


给定: int mdArray[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

  • mdArray 是指向 3 元素数组的指针
  • 该数组中的每个元素都是指向 3 元素数组的指针
  • 这些数组中的每个元素都是一个整数

因此,只需将您的原始语法嵌套在自身内部,替换为取消引用的 var 而不是多维数组本身的名称

    int mdArray[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    
    for(auto *d1 = mdArray; d1 != (mdArray + 3); d1++)
    {
      for(auto *d2 = *(d1); d2 != (*(d1) + 3); d2++)
      {
        std::cout << *(d2) << ' ';
      }
      std::cout << std::endl;    
    }

推荐阅读