通过引用传递数组
Passing arrays via reference?
我对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];
,则 a
和 b
已经是指向这些数组开头的指针。
当你执行a[0]
时,那就是当你实际上在某个偏移量上尊重数组以访问数组中的元素时。 例如,a[1]
与*(a+1)
相同
参考: http://www.cplusplus.com/doc/tutorial/arrays/
相关文章:
- 通过指针与数组引用扩展数组索引序列
- 将链表的内容放在数组引用中
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- C 在将数组引用分配给struct时麻烦
- Typedef数组引用
- 通过强制转换创建子数组引用
- 将数组引用 'T(&)[n]' 引用到 'std::array<T, n>' 的内容
- constexpr 数组引用参数
- 寻找有关函数定义和原型中数组引用的说明
- Initializer_list作为非模板上下文中数组引用参数的参数
- 如何使用一个动态创建的一维数组的二维数组引用仅与标准库?
- 如何返回具有大小的POD数组引用
- 在C++中返回数组引用的语法
- 是否可以声明转换函数返回数组引用而不使用typedef
- 自定义到数组引用的转换
- 类数组引用的NullReferenceException
- 数组指针与数组引用之间的差异
- 在c++中传递数组引用
- 使用特征矩阵作为特征数组引用的参数
- 如何从函数传递数组引用