我对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];
}
指向数组的指针有什么不同?我四处搜寻但没有运气。
答案 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];
时,a
和b
已经指向这些数组的开头。
当你执行a[0]
时,就是你实际上在一些偏移处对数组进行deference以访问数组中的元素。例如,a[1]
与*(a+1)