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];
}

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

4

3 回答 3

6

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

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);
}
于 2012-11-30T18:30:14.510 回答
3

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

于 2012-11-30T18:26:33.700 回答
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/

于 2012-11-30T18:27:33.040 回答