通过引用传递数组

Passing arrays via reference?

本文关键字:数组 引用      更新时间:2023-10-16

我对C++相当陌生,最近遇到了这个问题。

这段代码显然会起作用:

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

那么为什么这会返回错误呢?视觉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];
}

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

类型 int *a[2] 表示指向 int 的 2 个指针的数组

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

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

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

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

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

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

需要void setvalues(int (&c)[2], int (&d)[2])才能通过引用传递。并且呼叫者必须setvalues(a, b); .否则,您充其量只能逐个指针传递指针。

这是您修复它的方法:

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/