0

我正在传递函数:

fillArrays(arrays);

现在,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;
        }
    }
}

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

4

4 回答 4

3

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

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

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

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

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

于 2012-09-19T10:48:46.670 回答
1

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

于 2012-09-19T09:29:08.987 回答
0

这是可行的,不可行的。

  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;

        }
    }
}
于 2012-09-19T09:54:25.967 回答
0

您传递数组的方式很好,但是您可以大大缩短您的功能。如果您只需要这些值,您可以简单地执行以下操作:

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];
    }
}
于 2012-09-19T09:38:49.743 回答