我想通过传递硬编码数组来测试一个运行时分配的多维数组的函数。
该函数的签名为void generate_all_paths(int** maze, int size)
,数组定义为int arr[5][5] = {REMOVED}
。
我不确定如何正确强制该函数的数组(或者如果这是不可能的话)。
答案 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::vector
或std::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对象或通过网络将其作为一个整体发送,你应该使用第二个。