【问题标题】:How to loop through a multidimenional array through pointers in C++如何通过 C++ 中的指针循环遍历多维数组
【发布时间】:2021-07-28 10:02:16
【问题描述】:

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

#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++ arrays for-loop pointers


    【解决方案1】:

    给定: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;    
        }
    

    【讨论】:

      【解决方案2】:

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

      应该是

      for(auto p = &(lineP[0]); p!= &(lineP[3]); ++p) { std::cout

      注意自动 p。你问了一个地址指针。你做了一个指针指针。 然后解引用,结果是地址,不是值。

      你也可以计算出**p

      【讨论】:

        猜你喜欢
        • 2013-05-20
        • 2013-08-15
        • 1970-01-01
        • 2016-01-12
        • 2013-04-01
        相关资源
        最近更新 更多