2012-05-03 4 views
1

Я не могу создать ссылку на массив unsigned charz в пределах myfunc(). Я пробовал несколько способов, но просто не могу понять. Это моя последняя попытка: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), но даже вызывающий абонент не может сделать это (!), И вы получите если вы попробуете. Если вы этого хотите, используйте фактический указатель.

- - законное использование для передачи массива по ссылке с использованием синтаксиса в вашем примере, который должен обеспечить размер объявленного массива. Но если вы просто учитесь, я не думаю, что вам нужно еще об этом беспокоиться.

Смежные вопросы