2012-10-18 43 views
1

可能重复:
passing 2D array to function在函数中传递数组还有其他方法吗?

我的问题是关系到传递一个数组为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传球参数是一个数组,我想知道是否有经过这种说法的其他方式。谢谢!

回答

3

fun需要一个指针到阵列的-3-双并假定(依靠呼叫者),该指向至少3个阵列-的-3-阵列的所述第一元件双打。它的确如此,因为正如你所说在main中提供给该调用的参数是一个数组。这会立即衰减到指向其第一个元素的指针。

一个替代方案是为fun采取指针到​​3×3阵列-的双,因为它假设尺寸反正和调用者实际上有这样的兽:

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

你不能像这样传递一个数组,它总是衰减到一个指针。但是如果你包装一个结构体,你可以传递一个数组。这适用于C和C++。在C++中,您可以将引用传递给数组。在这两种情况下,阵列都是固定的大小。

// as a struct 
struct Array 
{ 
    int elems[10]; 
}; 

void func(Array a); 

// as a reference 
void func(int (&a)[10]); 
1

如果您非常喜欢,也可以使用基本指针并自行完成偏移量,假设您的数组已分配或声明为具有dim * dim元素。

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的<>的后端)。