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

2 Ответы

+5 голосов
 
Лучший ответ

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

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). Компилятор выдаст ошибку, если функция попытается изменить переданный аргумент в своём теле.

(138 баллов) 1 5 14
выбран
Спасибо, исчерпывающе!
+1 голос
В синтаксисе языка си++ , на которым вы программируеие.
*a - Непрямое обращение («объект, на который указывает a )
&a - Ссылка («адрес a ») .
(2 тыс. баллов) 5 14 37
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. parovoZZ

    52 балл(ов)

  2. dartWaiter

    42 балл(ов)

  3. Un_ka

    14 балл(ов)

  4. Тигрыч

    12 балл(ов)

  5. Aromik

    12 балл(ов)

  6. BAR__MEN

    10 балл(ов)

Награды месяца
1-е место: Teensy 3.6
2-е место: Teensy 3.5
3-е место: Teensy 3.2

...