我正在传递这个功能:
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;
}
}
}
如果您需要任何进一步的信息,请告诉我们,谢谢!
答案 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)
这将是有效的,有效的是什么。
数组的传递可以正常工作。
您还需要将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;
}
}
}