Переменные в функцию - стек или ОЗУ?

Тема в разделе "Микроконтроллеры AVR", создана пользователем parovoZZ, 24 янв 2019.

  1. parovoZZ

    parovoZZ Гуру

    Есть у меня функция
    Код (C++):
    void My_function (my_struct_t my_struct)
    {
    }
    Мне ее достаточно переписать так
    Код (C++):
    void My_function (my_struct_t &my_struct)
    {
    ..... // в теле функции ничего не меняем
    }
    ?
    А структуру
    Код (C++):
    my_struct_t my_struct;
    в функцию передать вот так
    Код (C++):
    My_function (&my_struct);
    ?
    Или надо создать переменную-ссылку и с её помощью оперировать?
    И сцылку можно только один раз создать? Переопределить её на другой объект низзя?
     
  2. DetSimen

    DetSimen Guest

    Мне ее достаточно переписать так

    void My_function (my_struct_t &my_struct)
    {
    ..... // в теле функции ничего не меняем
    // но можно и менять, ты же ее адрес передаешь
    }

    в функцию передать вот так

    My_function (my_struct); уже без &


    Да.
     
  3. DetSimen

    DetSimen Guest

    Или надо создать переменную-ссылку и с её помощью оперировать?
    Нет.

    И сцылку можно только один раз создать?
    Можно.

    Переопределить её на другой объект низзя?
    Можно, на другую структуру таковаже типа
     
    parovoZZ нравится это.
  4. DetSimen

    DetSimen Guest

    тебе трактат написать "о ссылках", или ты других, более трезвых авторов почитаешь?
     
  5. parovoZZ

    parovoZZ Гуру

    я с учебниками не бухаю, а вот за рюмашечкой про указатели (чтоб им пусто было) самое оно)
     
  6. SergeiL

    SergeiL Оракул Модератор

    void My_function (my_struct_t &my_struct)
    {
    ................
    }

    Это корректно??? Не *
     
  7. DetSimen

    DetSimen Guest

    Корректно. На самом деле в функцию передается адрес твоей структуры, 2 байта.
     
  8. parovoZZ

    parovoZZ Гуру

    я имел ввиду, что код не переписываем
     
  9. DetSimen

    DetSimen Guest

    указатель и ссылка это вроде как и адреса (оба) а трактуются по разному.
    в функцию обьявленную как
    void f(mystruct_t *mystruct)
    передается указатель на структуру (её адрес) , причом он может быть и пустым, то есть оба вызова будуть корректными:
    mystruct_t struct1;
    f(struct1); и
    f(NULL);
    ошибки не будет. А вот когда ты обьявляешь так:
    void f(mystruct_t &mystruct)
    то вроде тоже передается адрес, но есть существенное отличие, ты не можешь передать в функцию ничего, кроме переменной типа mystruct_t. Не бывает пустых ссылок, ни на что (void). то есть при вызове такой функции ты обязан передать ей переменную описанного типа и ничего кроме. Если переменных такого типа несколько, то в функцию ты можешь передать любую из них. На самом деле, передасца адрес, но он не сможет быть пустым. Бонусом будет то, что передав переменную по ссылке, обращаться к полям ты можешь обычно, через точку, а не как с указателями, через ->. Ссылка как будто бы просто подставляет твою внешнюю переменную внутрь функции
     
    b707, SergeiL, parovoZZ и ещё 1-му нравится это.
  10. Указатель указывает на адрес в памяти. Ссылка в C++ указывает на переменную, как абстрактную конструкцию. Соответственно функционал ссылок более ограничен, но более безопасен, и позволяет компилятору более свободно с ними обращаться и оптимизировать многие операции. Может передавать по адресу, может скопировать, может делать что ему заблагорассудится, пока сохраняется функционал.
    Соответственно, лучше использовать ссылки, если есть такая возможность.
     
  11. DetSimen

    DetSimen Guest

    вот. дядяВитя тебе сразу всё с первого раза доходчиво объяснил. Даже я понял.
     
  12. Asper Daffy

    Asper Daffy Иксперд

    Кого? Саму ссылку или объект на который она ссылается?
     
  13. Значение переменной.
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Какой - самой ссылки или той на которую ссылка указывает?
     
  15. parovoZZ

    parovoZZ Гуру

    А вы не с аднаго завиденья? Больно на прахфессора смахивает. Тоже везде знает.
     
  16. parovoZZ

    parovoZZ Гуру

    Честно говоря, вот здесь не отгружаю - ведь амперсанд говорит нам о том, что здесь необходимо передать адрес переменной, а мы подсовываем саму переменную.
    Вот здесь тоже - адрес, если он находится в пределах ОЗУ, не может быть "в никуда". Он по-любому указывает на какую-то ячейку, в которой (ну вот хоть убейся) нолики и единички. Если абстрагироваться от железа и уяснить, что это уровень компилятора и компилятор знает, что именно это ячейка ни чем не занята (null), то тогда все сходится.
     
  17. Asper Daffy

    Asper Daffy Иксперд

    Попал дед :)
     
  18. DetSimen

    DetSimen Guest

  19. И то и то
     
  20. DetSimen

    DetSimen Guest

    Внутри функции ссылка это просто псевдоним внешней переменной