C++数组引用

C++数组引用,c++,char,pass-by-reference,C++,Char,Pass By Reference,我无法在myfunc中创建对无符号字符数组z的引用。我试过几种方法,但就是想不出来。这是我最近的一次尝试: 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)

我无法在myfunc中创建对无符号字符数组z的引用。我试过几种方法,但就是想不出来。这是我最近的一次尝试:

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,无符号字符&z[2]

以及:

对于线int x=myfuncy,x

我应该如何引用数组本身而不是引用数组

myfunc(y, z[2]);
表达式z[2]的类型为unsigned char,它引用数组末尾以外的元素,因此它是未定义的行为。您要执行以下操作:

myfunc(y, z);
表达式z[2]的类型为unsigned char,它引用数组末尾以外的元素,因此它是未定义的行为。您要执行以下操作:

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

这是因为z表示无符号字符[2],但z[2]表示字符类型。此外,z[2]访问数组超出范围。

调用应该是:int x=myfuncy,z


这是因为z表示无符号字符[2],但z[2]表示字符类型。此外,z[2]访问数组超出范围。

我对您试图执行的操作有点困惑。IMHO您的签名应该是int myfunc int&y,unsigned char z[2]

如果您想这样做,数组不会按值传递,那么使用向量是最简单的方法,并且默认设置使您的get_mac函数(我假设它是myfunc)按预期工作,除非我误解了您的愿望

签名int myfunc int&y,unsigned char&z[2]表明您可能希望在调用者中更改z本身的值,而不仅仅是z的元素,甚至调用者也不能这样做!,如果你尝试,你会得到一个错误。如果需要,请使用实际指针


使用示例中的语法通过引用传递数组是有合法用途的,即强制声明的数组大小。但如果你只是在学习,我想你还不必担心这个问题。

我对你想做什么有点困惑。IMHO您的签名应该是int myfunc int&y,unsigned char z[2]

如果您想这样做,数组不会按值传递,那么使用向量是最简单的方法,并且默认设置使您的get_mac函数(我假设它是myfunc)按预期工作,除非我误解了您的愿望

签名int myfunc int&y,unsigned char&z[2]表明您可能希望在调用者中更改z本身的值,而不仅仅是z的元素,甚至调用者也不能这样做!,如果你尝试,你会得到一个错误。如果需要,请使用实际指针


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

使用向量非常容易,而且比原始数组要好得多。无论如何,您是通过传入单个元素来调用函数的。使用z,而不是z[2]。我正在尝试沿着这一边学习向量,这会使这更容易吗?我能看到的唯一方法是全局定义数组,据我所知,这并不好。使用向量,您的签名将是:int myfunc int&y,std::vector&z。它们提供了使用其他类型参数时所需的语法。使用向量非常简单,而且比使用原始数组要好得多。无论如何,您是通过传入单个元素来调用函数的。使用z,而不是z[2]。我正在尝试沿着这一边学习向量,这会使这更容易吗?我能看到的唯一方法是全局定义数组,据我所知,这并不好。使用向量,您的签名将是:int myfunc int&y,std::vector&z。它们提供了使用其他类型参数时所需的语法。感谢您的快速响应:感谢您的快速响应:也感谢您的快速响应:也感谢您的快速响应: