2012-11-30 99 views
7

我对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

[CDECL(http://cdecl.ridiculousfish.com/?q=int+*c%5B2%5D)是你的朋友。 –

回答

6

类型int *a[2]装置阵列的2个指针int,但与定义int a[2]表达&a装置指针为2的数组int。两者都是不同的类型,它们之间没有转换。由于弗拉德已经提到,为您提供需要加括号的正确类型:

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

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

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

在你不需要的后一种情况使用或取消对它的引用地址的运营商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); 
} 
+0

我明白了,谢谢。我认为它也是一样的字符串数组呢? – NoToast

+0

@ user1867129:它取决于* string *的含义,但是对于所有类型,语法是一致的,如果要使用指向数组的指针,则必须使用倒置圆括号(倒置的意思是圆括号'int(* a)[2]'实际上将*之外的所有内容*括号括起来:* a是指向在parens之外描述的类型的指针*) –

3

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

+0

感谢您的回答! – NoToast

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],那就是当你实际上以某个偏移量来访问数组以访问数组中的元素时。 a[1],例如,是相同的*(a+1)

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

+1

这不完全正确,因为它与传递指针相同。该阵列的长度是多少?它在编译期间执行?没有.. – 2012-11-30 18:28:55