将int [5] [5]类型的变量传递给需要int **的函数

时间:2009-02-11 06:43:47

标签: c++ c multidimensional-array

我想通过传递硬编码数组来测试一个运行时分配的多维数组的函数。

该函数的签名为void generate_all_paths(int** maze, int size),数组定义为int arr[5][5] = {REMOVED}

我不确定如何正确强制该函数的数组(或者如果这是不可能的话)。

7 个答案:

答案 0 :(得分:6)

这个多维数组主题不幸让很多C ++程序员感到困惑。嗯,这是解决方案:

void generate_all_paths(int (*maze)[5], int size);

这就是函数声明必须看起来的样子。

是一种替代方案,但完全等效
void generate_all_paths(int maze[][5], int size);

两者都创建一个参数,该参数是指向5个整数数组的指针。然后,您可以将包含5个整数的数组数组传递给该函数:

generate_all_paths(arr, 5);

因为数组的第一个元素是一个包含5个整数的数组,所以当传递给该函数时,它将自动(隐式)转换为指向第一个元素的指针。

在评论中,您已经证明您已绑定到int**,因为您的内部和外部维度都必须具有运行时值。不能再使用多维数组。你可以为测试目的做的是创建一个像这样的指针数组:

int store[5 * 5] = { ..... };
int *arr[5] = { store, store + 5, store + 10, store + 15, store + 20 };

然后,实际上,您可以让您的函数接受int**。作为您数组的第一个元素是int*,它将自动转换为int**。另一种方法是将数据保存在二维数组中,但只是创建一个由该数组指针构成的“视图”:

int *arr[5] = { store[0], store[1], store[2], store[3], store[4] };

商店是您的int[5][5]数组。由于store[n]访问该二维数组的第n个子数组,并且其元素类型为int,因此指针转换后的类型为int*,这将是再次兼容。

答案 1 :(得分:3)

你可以写:

void display(char **a)

然后使用a[i][j]来引用其中的元素。

声明char **表示“指向整数指针”。把它分解为几步:

char *b = a[i];

它会指向数组数组中i'数组的第一个元素。

char c = b[j];

它可以获得数组j中的b个元素。

您将遇到的下一个问题是分配这样的数组数组。

char **arrayOfArrays = new char *[10];

for (int n = 0; n < 10; n++)
    arrayOfArrays[n] = new char[20];

分配一个包含10个数组的数组,每个“子”数组包含20个字符。

在C / C ++中,数组访问语法只是一种从指针那里检索一个值的方法。

char *p = "Hello";

char *pl = p + 2;   // get pointer to middle 'l'
char l = *pl;       // fetch

char o = p[4];      // use array syntax instead

答案 2 :(得分:1)

  

而且,为什么数组是保留字?

不是。您可能正在使用Visual Studio将其显示为关键字,因为它在C ++ / CLI中用作本机托管类型。但是,这与C ++无关,而Visual Studio在这方面具有误导性。

至于你的问题:你可以简单地将指针传递给char,然后直接传递你的嵌套数组(如果你正在使用动态分配的数组):

void display(char** array) …

也就是说,你的函数假设一个固定的,已知的数组长度和一些其他细节。更好的方法是使用嵌套的std::vectorstd::string(例如)。使用这些现有的数据类型可以让您的生活更轻松

void display(std::vector<std::string> const& array) {
    for (size_t i = 0; i < array.length(); ++i)
        cout << array[i] << endl;
}

要利用这一点,您的调用代码也需要更改,以便在char上使用这些数据结构而不是普通C数组。

答案 3 :(得分:1)

void display(char ** array) 应该管用。另外,我不认为它是标准C / C ++中的保留字。

答案 4 :(得分:0)

arr是指向你所拥有的多维数组的指针,实际上是指向int的指针。现在,由于您的函数接受指向int指针的指针,您需要使用arr获取&arr的地址并将其传递给函数,以便您拥有此代码: / p>

强制数组:将&arr传递给该函数。 引用func中的数组:*maze[x][y]

答案 5 :(得分:0)

最好的方法是使用指针,但Borland C ++承认传递数组作为函数的参数。看看这段代码(包括:iostream和conio):

////////////////////////////////////////////

void ReceivedArray(char x[5]){

for (int i=0; i<5; i++ )
cout << x[i];

}

void main(){

char *x = new char[5];

for (int i=0; i<5; i++ )
x[i]='o';

ReceivedArray(x);
getchar();
}


///////////////////////////////////////////////////////////////


For passing 2D arrays (oops! some lines in spanish, sorry!):

(includes: iostream, stdlb, stdio and math)


/////////////////////////////////////////////////

using namespace std;

void ver(int x[][20]){
for(int i=0; i<15; i++)  {
  for(int j=0; j<20; j++) {
   cout<< x[i][j] <<" ";       }
   cout << "\n";        }

}

void cambiar0(int x[][20]){ int n[255];
   for (int i=255; i>=0; i--)
    n[255-i]=i;


for(int i=0; i<15; i++)
  for(int j=0; j<20; j++)
      for(int k=0; k<255; k++)
       if(x[i][j]==n[k])  {
          x[i][j]=k; break;  }  
}

int main(int argc, char* argv[]){
int x[15][20]; char a; 

for(int i=0; i<15; i++)
  for(int j=0; j<20; j++)
   x[i][j]=rand()%255;

  cout << "¿desea ver la matriz? s/n ";
 cin >> a;
 if(a=='s') ver(x);

 cambiar0(x);

 cout << "\n\n";
 cout << "¿desea ver la matriz? s/n ";
 cin >> a;
 if(a=='s') ver(x);

system("PAUSE"); return 0;
}

///////////////////////////////////

希望这就是你的意思。

答案 6 :(得分:0)

Earwicker的答案错过了一个重要的事实。他提出的是一系列数组。对于第一个,这浪费了指针数组的内存(“char ** arrayOfArrays = new char * [10]”是这个的创建点)。对于第二个,字符阵列可能不是连续的存储器块,这通常是个问题。 C ++中唯一的解决方法是创建一维数组并在需要时计算索引。

char *b = new char[width*height];

然后你可以像这个

一样引用元素x,y(x是沿宽度,y是沿着高度)
char c=b[width*y+x];

然而这可能比上面的解决方案慢一点(在GCC 3.4.5上测量),所以如果你对连续内存不感兴趣(例如你总是用[] []访问元素,那么永远不要添加整数到指针并解除引用它),那么你应该使用数组af数组。但是,如果您对连续记忆感兴趣,例如要将它作为初始化程序传递给std :: string对象或通过网络将其作为一个整体发送,你应该使用第二个。