我的问题与将数组作为C ++函数参数传递有关。让我先说明一下这个例子:
void fun(double (*projective)[3])
{
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
{
projective[i][j]= i*100+j;
}
}
int main()
{
double projective[3][3];
fun(projective);
for(int i=0; i<3; i++)
{
cout<<endl;
for(int j=0; j<3; j++)
cout<<projective[i][j]<<" ";
}
return 0;
}
在这个例子中,fun
的传递参数是一个数组,我想知道是否还有其他传递这个参数的方法。谢谢!
答案 0 :(得分:3)
fun
采用指向3的数组的指针,它假定(依赖于调用者)这指向至少3个数组-3的数组的第一个元素双打。它的作用,因为你说main
中提供给调用的参数是一个数组。这会立即衰减到指向其第一个元素的指针。
一个替代方案是fun
采用指向3x3-double-double的指针,因为它无论如何都假定大小而且调用者确实有这样的野兽:
void fun(double (*p_projective)[3][3])
{
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
{
(*p_projective)[i][j]= i*100+j;
}
}
使用fun(&projective)
调用它。
答案 1 :(得分:1)
你不能这样传递数组,它总是衰减到一个指针。但是如果你用一个结构包装它就可以传递一个数组。这适用于C和C ++。在C ++中,您可以传递对数组的引用。在这两种情况下,阵列都是固定大小。
// as a struct
struct Array
{
int elems[10];
};
void func(Array a);
// as a reference
void func(int (&a)[10]);
答案 2 :(得分:1)
如果您如此倾向,您也可以使用基指针并自行执行偏移,假设您的数组已分配或声明为具有暗淡*暗淡的元素。
void fun(double *projective, size_t dim)
{
for(size_t i=0; i<dim; i++)
for(size_t j=0; j<dim; j++)
projective[i*dim+j] = i*100+j;
}
int main(int argc, char *argv[])
{
double ar[5*5];
fun(ar, 5);
return 0;
}
有很多方法可以做到这一点,这只是一个,但通常最容易缠绕我的头(我通常使用std :: vector&lt;&gt;作为后端)。