Передача адреса переменной в функцию в Си

Поделиться
HTML-код
  • Опубликовано: 12 сен 2024
  • По умолчанию параметры передаются по значению, то есть копируются.
    Передаём функции параметр адресного типа.
    Изменение переменной-параметра из функции.
    Нельзя передавать адрес локальной переменной вне функции.
    Курс молодого бойца по информатике (Язык Си).
    cs.mipt.ru/c_intro

Комментарии • 32

  • @swagcat605
    @swagcat605 4 года назад +5

    Отлично обьяснено! Спасибо!
    С удовольствием бы послушал про подобную ситуацию, но уже когда мы передаём в функцию обьект лежащий на куче!

  • @recreationreally4382
    @recreationreally4382 4 года назад +8

    Хорошо бы объяснить почему НЕЛЬЗЯ возвращать АДРЕС ЛОКАЛЬНОЙ переменной. Например, рассказав про область видимости переменной и время жизни.
    Локализовать переменную можно не только объявив ее в функции, но и просто окружив фигурными скобками (удобный прием).

    • @ligecss1928
      @ligecss1928 3 года назад +1

      @@hiler844 Саня шарит, он поправил.

    • @user-gf4iy3ly2z
      @user-gf4iy3ly2z 8 месяцев назад

      Потому, что она будет уничтожена из стека при выходе из функции, указатель просто будет указывать на несуществующую более переменную😁😁😁

  • @arthurshaidullin7981
    @arthurshaidullin7981 4 года назад +3

    ну хоть кто-то объяснил как эти поинтеры использовать в функции, большое спасибо ))

  • @alexs7952
    @alexs7952 2 года назад +2

    Я не догнал почему программа падает. Мы вернули адрес локальной переменной, который должен указывать на стек. После возврата того фрейма в стеке уже нет, но адреса то наши, я ожидал, что будет выведено либо 888, если память не затерлась ещё, либо другое число если содержимое по адресу изменилось.

  • @romkagm7756
    @romkagm7756 3 года назад +4

    10:20 как же я заорал))

  • @denixal
    @denixal Год назад +1

    Спасибо. Когда нибудь я пойму эти указатели😂

  • @juvusart
    @juvusart 5 лет назад +1

    Спасибо за уроки!

  • @nicholasspezza9449
    @nicholasspezza9449 7 месяцев назад +1

    Программируя на Си, пятаком ты не тряси! 🤫

  • @bubikgenover9160
    @bubikgenover9160 3 года назад +1

    10:30 моя жизнь никогда не будет прежней.. до этого дня я только никогда не бросал сцепление..

  • @user-pk3tq5vk9b
    @user-pk3tq5vk9b 4 года назад

    Годнотаа!) Спасибо Тимофей!)

  • @Duvanoff
    @Duvanoff 3 года назад +2

    А если локальную переменную внутри foo объявить static?

    • @Duvanoff
      @Duvanoff 3 года назад +3

      отвечу сам себе же. попробовал со статиком. как и должно быть компилятор не ругается и из main дотягиваюсь до cодержимого переменной объявленной static как до глобальной.

  • @rodiongolovin2902
    @rodiongolovin2902 5 лет назад

    спасибо)) супер инфа

  • @user-nl4ps9rm9o
    @user-nl4ps9rm9o 4 года назад +1

    а почему не использовать в таком случае глобальные переменные вместо работы через указатель?

    • @bohdankladochnyi3995
      @bohdankladochnyi3995 4 года назад +1

      Глобальные переменные - зло. Почему? - в интернете достаточно информации.

    • @имяфамилия-ь5з1в
      @имяфамилия-ь5з1в Год назад

      Можно использовать и глобальные переменные
      Но у каждого подхода есть плюсы и минусы
      1) указатели - переменные могут быть только как средство обмена между несколькими функциями и их никто не поменяет где-то без вашего контроля
      2) глобальные переменные - удобны при передачи и хранении некого состояния системы где нужно использовать сразу 20-100 переменным, пропихивать их через функцию к функции через указатели - просто не рационально
      Выгоднее завести класс // но если класс будет доступен везде и всем - это мало отличается от глобальных переменных. Разве что порядка больше при организации большого числа переменных, но и писанины кода тоже больше.

  • @AkatlaLet
    @AkatlaLet 3 года назад +1

    foo - ААААААААА как мне это знакомо!!!! Не преобразование типа, а привидение типа! Так стоп, с этого места подробнее - как это в Си нету ссылок - чистом! Уже отменили? Потрудитесь обьяснить Ваше утвержедение!

  • @bigsiege7684
    @bigsiege7684 7 месяцев назад +1

    Для объяснения реально надо 10 минут?

  • @user-rs1wv7dq4f
    @user-rs1wv7dq4f 4 года назад

    Почему, когда я передаю строку "abc" в функцию, которая имеет параметр указатель, я не указываю с ней &?

    • @romkagm7756
      @romkagm7756 3 года назад +1

      Потому что имя функции это указатель на нулевой елемент массива

    • @alexs7952
      @alexs7952 2 года назад

      @@romkagm7756 Имя функции или имя параметра?

  • @xomegs1439
    @xomegs1439 5 лет назад

    Visual Studio 2019 пишет warning о локальной переменной, но программа не падает, а выдает что *py = 888. Что в ней изменилось?

    • @petrpetr9576
      @petrpetr9576 4 года назад

      Ничего не изменилось, это нормально

    • @alexs7952
      @alexs7952 2 года назад

      Я тоже не понял почему программа падает. Мы вернули адрес локальной переменной, который должен указывать на стек. После возврата того фрейма в стеке уже нет, но адреса то наши, я ожидал, что будет выведено либо 888, если память не затерлась ещё, либо другое число если содержимое по адресу изменилось.

    • @rau149
      @rau149 Год назад

      Все из за чертового кеширования.
      Это шутка

  • @AspireM3400
    @AspireM3400 3 года назад

    Это понятно, что адрес локальной переменной не возвращается. Ведь локальная переменная перестает существовать, по завершении функции, а значит и адреса никакого уже нет.

    • @alexs7952
      @alexs7952 2 года назад +1

      С чего бы адрес перестал существовать?

  • @user-ne4bd3ry1n
    @user-ne4bd3ry1n 4 года назад

    +

  • @recreationreally4382
    @recreationreally4382 4 года назад

    Что за нездоровая любовь к функции с именем "фу"? Назовите f или религия не позволяет?

    • @ThisDaveAndThatJohn
      @ThisDaveAndThatJohn 4 года назад +13

      читать что-то кроме документации (например истории) умеем или религия не позволят?
      en.wikipedia.org/wiki/Foobar