Для чего нужны символы * и &

Мучаю Ардуину уже около года, но так и не понял зачем ставят эти символы (*, &)при объявлении параметров. Объясните пожалуйста, а то пользуюсь но не знаю зачем. Спасибо.

Если говорим об объявлении параметров функций и методов, то вот, какие варианты возможны:

```
void myFunc(SomeType arg); // 1
void myFunc(SomeType* arg); // 2
void myFunc(SomeType& arg); // 3
void myFunc(const SomeType* arg); // 4
void myFunc(const SomeType& arg); // 5
```
В первом случае параметр передаётся *по значению*. Это означает, что в месте вызова функции создаётся копия передаваемого значения и уже оно даётся в распоряжение функции. Функция может менять и крутить и менять его как хочет, без опасения «задеть» оригинальное значение. Этот способ хорошо подходит для простых типов вроде `int`, `char`, `float`, т.к. операция копирования для них дешёвая, а менять оригинальные значения обычно не требуется.

Во втором и третьем случае параметр передаётся *по ссылке*. Это означает, что в месте вызова функции программа получает *адрес* передаваемой переменной и функции предоставляет не копию `SomeType`, а адрес существующей переменной. Разница между * и & небольшая: в случае (2) вы должны явно показать, что отдаёте адрес, а в случае (3) компилятор это сделает за вас:

```
myFunc(&myVariable); // 2
myFunc(myVariable); // 3
```
Когда вы передаёте аргумент по ссылке, функция в полном праве изменить его значение, тем самым влияя на внешние данные. Именно из-за того, что разница между (1) и (3) не заметна синтаксически, многие программисты предпочитают не использовать (3) и предпочитают (2).

Передавать значение по ссылке имеет смысл тогда, когда аргумент «толстый» и делать копию при вызове накладно. Например, это может быть `struct` с множеством полей (матрица, например) или объект класса (Serial, например). Ещё один случай: если хочется из функции вернуть более одного результата. Например, она может возвращать `bool`, который говорит «получилось или не получилось», а результат, если получился класть в аргумент `char* out`.

Если проблема именно в том, что не хочется делать копию данных, а побочных эфектов функция производить не планирует, используют формы `const`: (4) и (5). Компилятор выдаст ошибку, если функция попытается изменить переданный аргумент в своём теле.



В синтаксисе языка си++ , на которым вы программируеие.   

*a - Непрямое обращение («объект, на который указывает a )  

&a - Ссылка («адрес a ») .