【问题标题】:Am I passing this 2 dimensional array incorrectly? [closed]我是否错误地传递了这个二维数组? [关闭]
【发布时间】:2012-09-19 09:20:03
【问题描述】:

我正在传递函数:

fillArrays(arrays);

现在,数组是一个二维数组。我这样声明数组:

int **arrays = new int*[NUM_OF_ARRAYS];
    arrays[0] = new int[128];
    arrays[1] = new int[512];
    arrays[2] = new int[2048];
    arrays[3] = new int[8192];
    arrays[4] = new int[32768];
    arrays[5] = new int[131072];
    arrays[6] = new int[524288];
    arrays[7] = new int[2097152];

我是否正确地将数组传递给以下函数?

void fillArrays(int **arrays) {
    const int NUM_OF_ARRAYS = 8;
    for(int i = 0;i < NUM_OF_ARRAYS;i++) {
        switch(i) {
        case 0:
            for(int j = 0;j < 128;j++)
                arrays[i][j] = 1 + rand() % 2000;
            break;
        case 1:
            for(int j = 0;j < 512;j++)
                arrays[i][j] = 1 + rand() % 5000;
            break;
        case 2:
            for(int j = 0;j < 2048;j++)
                arrays[i][j] = 1 + rand() % 10000;
            break;
        case 3:
            for(int j = 0;j< 8192;j++)
                arrays[i][j] = 1 + rand() % 30000;
            break;
        case 4:
            for(int j = 0;j < 32768;j++)
                arrays[i][j] = 1 + rand() % 100000;
            break;
        case 5:
            for(int j = 0;j < 131072;j++)
                arrays[i][j] = 1 + rand() % 200000;
            break;
        case 6:
            for(int j = 0;j < 524288;j++)
                arrays[i][j] = 1 + rand() % 1000000;
            break;
        case 7:
            for(int j = 0;j < 2097152;j++)
                arrays[i][j] = 1 + rand() % 30000000;
            break;
        }
    }
}

如果您需要任何进一步的信息,请告诉我,谢谢!

【问题讨论】:

  • 你声明数组的准确程度如何?
  • 很想给出“是的,你确实正确传递了数组”作为答案:P
  • @LeeNeverGup 我在问题中添加了我的声明。
  • OT:摆脱外部循环 - 您循环的代码会立即消除每次迭代的歧义,进入单独的代码分支。这是没有意义的。
  • 很抱歉,您是否面临某种您认为是由于传递数组而导致的问题?这个问题还有其他意义吗?

标签: c++ arrays pointers syntax multidimensional-array


【解决方案1】:

我会尝试采取不同的方法并给出一个全面的答案,也许它会更清楚。 该函数将采用与声明它的参数的确切类型相匹配的任何变量。 C++ 中的基本数组只是一个常量指针(指向开头,保存其余部分的空间大小)。使用指针通过内存分配存储数组数组与 C++ 生成的二维数组并不完全相同(datatype arrays[const][const]**arrays = new datatype[const] 生成的汇编代码不同)。了解这一点很重要,因为您可以区分 指向指针的指针和 2D C++ 生成的数组

为简单起见,按原样处理您的参数:指向指针的指针。如果那是您传递给函数的内容,这是您的情况,那么您将正确的变量传递给正确的参数。 您在函数中处理该参数的方式将决定您是否将其视为二维数组

我这样回答是因为似乎有人怀疑为什么指向指针的指针被视为二维数组。如果是这样的话,你有理由怀疑。 2D 数组只是对变量所持有内容的一种解释,但 变量仍然是指向指针的指针,您可以对其进行与其他指针变量相同的处理(内存分配和释放、作为参数传递、处理等...)。

至于用结构(类)等替换它:我相信您这样做是为了通过创建动态多维数组来更好地理解内存分配和指向,仅使用 C++ 作为意思是。如果是这样的话,那么我相信我的回答会很好地满足您的需求。否则,有一些替代方案可以更好地抽象并自动处理内存分配(对于 C++,搜索 STL 容器)。如果你愿意的话,通过按照自己的方式去做,你会增加对“幕后”发生的事情的理解。它是在计算科学中比在现代或未来的程序化使用中更重要的知识。

希望答案是这样,您将能够通过了解正在发生的事情来处理类似的情况,这通常是这些情况下语法错误的真正原因。英语不是我的母语;对于可能的语义误用,我提前道歉。

【讨论】:

    【解决方案2】:

    我认为数组的传递没有任何问题。但我会更关心的是变量的范围和生命周期。数组元素应该可以在您的函数内部访问。

    【讨论】:

    • 在他的函数中可以访问它们
    • @SingerOfTheFall,我相信他是这么说的。
    【解决方案3】:

    以下是可行的和不可行的。

    1. 数组的传递可以正常工作。

    2. 您还需要用大括号 {..}for 循环括在 switch 块中。

    完整代码清单:

    #include <iostream>
    using namespace std ;
    
    const int NUM_OF_ARRAYS = 8;
    int **arrays = new int*[NUM_OF_ARRAYS];
    void fillArrays(int **arrays);
    
    
    int main(void)
    {
    
       arrays[0] = new int[128];
        arrays[1] = new int[512];
        arrays[2] = new int[2048];
        arrays[3] = new int[8192];
        arrays[4] = new int[32768];
        arrays[5] = new int[131072];
        arrays[6] = new int[524288];
        arrays[7] = new int[2097152];
    
    
       fillArrays(arrays);
    
    
      cout<<" \nPress any key to continue\n";
      cin.ignore();
      cin.get();
    
       return 0;
    }
    
    
    void fillArrays(int **arrays) 
    {
        const int NUM_OF_ARRAYS = 8;
        for(int i = 0;i < NUM_OF_ARRAYS;i++) 
        {
            switch(i) 
            {
            case 0:
                {
                for(int j = 0;j < 128;j++)
                {
                    arrays[i][j] = 1 + rand() % 2000;
                    cout<<arrays[i][j]<<"\n";}
                }
                break;
    
            case 1:
                {
                for(int j = 0;j < 512;j++)
                    arrays[i][j] = 1 + rand() % 5000;
                }
                break;
    
            case 2:
                {
                for(int j = 0;j < 2048;j++)
                    arrays[i][j] = 1 + rand() % 10000;
                }
                break;
    
            case 3:
                {
                for(int j = 0;j< 8192;j++)
                    arrays[i][j] = 1 + rand() % 30000;
                }
                break;
    
            case 4:
                {
                for(int j = 0;j < 32768;j++)
                    arrays[i][j] = 1 + rand() % 100000;
                }
                break;
    
            case 5:
                {
                for(int j = 0;j < 131072;j++)
                    arrays[i][j] = 1 + rand() % 200000;
                }
                break;
    
            case 6:
                {
                for(int j = 0;j < 524288;j++)
                    arrays[i][j] = 1 + rand() % 1000000;
                }
                break;
    
            case 7:
                {
                for(int j = 0;j < 2097152;j++)
                    arrays[i][j] = 1 + rand() % 30000000;
                }
                break;
    
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      你传递数组的方式很好,但是你可以大大缩短你的函数。如果您只需要这些值,您可以这样做:

      void fillArrays(int **arrays) {
      
          int divisors[8] = {2000,5000,10000,30000,100000,200000,1000000,30000000};
          int bounds[8] = {128,512,2048,8192,32768,131072,524288,2097152};
      
          for( int i = 1; i < 7; i++ )
          {
              for(int j = 0; j < bounds[i]; j++ )
                  arrays[i][j] = 1 + rand() % divisors[i];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        • 2020-08-07
        • 1970-01-01
        • 2020-02-17
        • 1970-01-01
        相关资源
        最近更新 更多