通过引用传递数组?

NoT*_*ast 7 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;
}
Run Code Online (Sandbox Code Playgroud)

那么为什么会返回错误呢?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];
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*eas 6

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

void setvalues( int (*c)[2] )
Run Code Online (Sandbox Code Playgroud)

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

void setvalues( int (&c)[2] )
Run Code Online (Sandbox Code Playgroud)

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

int a[2];
setvalues(a); // this is a reference to the array
Run Code Online (Sandbox Code Playgroud)

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

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