通过引用传递数组?

时间:2012-11-30 18:25:20

标签: c++ arrays pointers

我对C ++很新,我最近遇到了这个问题。

这段代码显然有效:

void setvalues(int *c, int *d)
{
    (*c) = 1;
    (*d) = 2;
}
int main()
{
    int a, b;
    setvalues(&a, &b);
    std::cout << a << b;
}

那么为什么会返回错误? Visual C ++ 2010错误:

  

C2664: 'setvalues' : cannot convert parameter 1 from 'int (*)[2]' to 'int *[]'

void setvalues(int *c[2], int *d[2])
{
   (*c[1]) = 1;
   (*d[1]) = 2;
}
int main()
{
    int a[2], b[2];
    setvalues(&a, &b);
    std::cout << a[1] << b[1];
}

指向数组的指针有什么不同?我四处搜寻但没有运气。

3 个答案:

答案 0 :(得分:6)

类型int *a[2]表示指向int 的2个指针数组,但带有&a定义的表达式int a[2]表示指针到2 int 的数组。两者都是不同的类型,它们之间没有转换。正如Vlad已经提到的,要提供正确的类型,你需要添加括号:

void setvalues( int (*c)[2] )

或者您可以在C ++中使用实际的引用

void setvalues( int (&c)[2] )

在后一种情况下,您不需要使用 address-of 运算符或在setvalue函数中取消引用它:

int a[2];
setvalues(a); // this is a reference to the array

编写代码的一种更简单的方法是使用typedef

typedef int twoints[2];
void setvalue( toints& c );
int main() {
   twoints a; // this is int a[2];
   setvalue(a);
}

答案 1 :(得分:3)

需要通过引用传递void setvalues(int (&c)[2], int (&d)[2])。并且来电者必须是setvalues(a, b);。否则,你最好通过指针传递指针。

答案 2 :(得分:2)

这就是你解决它的方法:

void setvalues(int c[], int d[])
{
   c[1] = 1;
   d[1] = 2;
}
int main()
{
    int a[2],b[2];
    setvalues(a, b);
    std::cout<<a[1]<<b[1];
}

当您声明这样的数组:int a[2],b[2];时,ab已经指向这些数组的开头。

当你执行a[0]时,就是你实际上在一些偏移处对数组进行deference以访问数组中的元素。例如,a[1]*(a+1)

相同

参考:http://www.cplusplus.com/doc/tutorial/arrays/