我错误地传递了这个二维数组吗?

时间:2012-09-19 09:20:04

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

我正在传递这个功能:

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;
        }
    }
}

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

4 个答案:

答案 0 :(得分:3)

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

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

我正在回答这个问题,因为似乎对为什么指向指针的指针被视为2D数组存在疑问。如果是这样的话,你有理由怀疑。 2D数组只是变量所持有的解释,但变量仍然是指向指针的指针,并且你给它与其他指针变量一样的处理(内存分配和释放,作为参数传递,处理等......)。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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];
    }
}

答案 3 :(得分:0)

这将是有效的,有效的是什么。

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

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

  3. 完整代码列表:

    #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;
    
            }
        }
    }