2012-05-03 40 views
1

我无法在myfunc()内创建对unsigned char数组z的引用。我尝试了几种方法,但无法弄清楚。这是我最近一次尝试:C++对数组的引用

int myfunc (int &y, unsigned char (&z)[2]); 

int main(int argc, char *argv[]) { 
int y = 1; 
unsigned char z[2]; 

int x = myfunc(y, z[2]); 
} 

int myfunc(int &y, unsigned char (&z)[2]) { 
y = 123; 
z[0] = foo; 
z[1] = bar; 
return 456; 
} 

我收到以下错误:

error: in passing argument 2 of ‘int myfunc(int&, unsigned char (&)[2])’ 

对于线int myfunc (int &y, unsigned char (&z)[2]);

和:

error: invalid initialization of reference of type ‘unsigned char (&)[2]’ from expression of type ‘unsigned char’ 

对于线int x = myfunc(y, x);

我该如何引用它自己的数组(而不是引用数组?)?

+0

使用向量使得这非常简单,而且比原始数组要好得多。无论如何,你通过传入一个元素来调用你的函数。使用'z',而不是'z [2]'。 – chris

+0

我正在尝试沿着这一边学习矢量,这将如何让这更容易?我能看到做这项工作的唯一方法是让数组在全局范围内定义,据我所知它并不好。 – jwbensley

+1

使用一个向量,你的签名是:'int myfunc(int&y,std :: vector &z)'。它们提供了使用其他类型参数所期望的语法。 – chris

回答

10
myfunc(y, z[2]); 

表达z[2]unsigned char型的(并且是指超出阵列的端部的元件,所以它是未定义的行为)。你想做的事:

myfunc(y, z); 
+0

感谢您的迅速反应:) – jwbensley

2

调用应该是:int x = myfunc(y, z);

这是因为z表示unsigned char [2]z[2]代表键入char。另外z[2]访问数组越界。

+1

感谢您也快速响应:) – jwbensley

1

我对你想要做的事有些困惑。恕我直言,你的签名应该是int myfunc (int &y, unsigned char z[2])

的阵列不获得通过“按值”(如果你想这样做,那么使用矢量是最简单的方法),以及默认使你get_mac功能(我认为应该是myfunc)工作根据需要(除非我误解了你的愿望)。

签名int myfunc (int &y, unsigned char (&z)[2])建议,你可能要更改来电者的z本身的价值(不仅仅是z元素),但即使调用者不能做到这一点(!),你会得到如果你尝试一个错误。如果你想要的话,使用一个实际的指针。

还有合法使用传递数组通过引用使用您的示例中的语法,这是执行声明的数组大小。但是如果你只是在学习,我认为你还不需要担心。