Изучение C++ для начинающих / #12 - Указатели и ссылки

Поделиться
HTML-код
  • Опубликовано: 7 фев 2025

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

  • @avilayn
    @avilayn Год назад +46

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

  • @makeyourgame2210
    @makeyourgame2210 3 месяца назад +4

    Пожалуй, лучшее объяснение указателей и ссылок, которые вызывают у многих достаточно сложностей

  • @ГлебШумигай
    @ГлебШумигай Год назад +22

    Автор молодец, так качественно делает ролики. Жалко что так мало актива.

  • @kpanat
    @kpanat Год назад +12

    Хорошей аналогией адреса является номер почтового ящика... Это просто число. Но надо иметь ввиду что эти номера идут подряд от 0. Память в компе это нумерованные ячейки по 1 байту которые идут подряд. Если мы указываем адрес то мы говорим что в ячейке с таким номером лежат наши данные. Точнее данные лежат в ячейках памяти начиная с такого-то номера отсчитанные от 0. Потому что данные не всегда занимают 1 байт а обычно больше и потому занимают не 1 ячейку, а больше. Но эти ячейки всегда начинаются с адреса памяти этих данных. Ничего сложного в адресах нет. Это оч простая вещь если понять. Просто этих ячеек памяти в компе дофига и потому числа получаются оч большие...

  • @user-a43ef53d
    @user-a43ef53d 13 дней назад

    уфффф.. наконец-таки я понял зачем в функциях получаемых из IDA куча лишних параметров вместе с указателями... наконец-таки понял что такое указатель и как с ним играть.. авесоме..

  • @ahmedikahmedabad9154
    @ahmedikahmedabad9154 Год назад +28

    автор уже как родной

    • @ОльгаЮрова-е9к
      @ОльгаЮрова-е9к 7 месяцев назад +2

      //дАДАДАДАДАДАДДА
      while (true)
      std::cout

    • @OTKA3
      @OTKA3 6 месяцев назад +1

      @@ОльгаЮрова-е9к int main() {
      while(true) {
      std::cout

    • @Tlay_Minecraft
      @Tlay_Minecraft 5 месяцев назад +1

      Вы не подключили

    • @desidemeokla
      @desidemeokla 5 месяцев назад

      @@Tlay_Minecraft Я думаю, всем итак понятно

    • @Maxnv_0
      @Maxnv_0 4 месяца назад

      Программа уйдёт в бесконечный цикл и выдаст ошибку

  • @rustamBegushchiy
    @rustamBegushchiy Месяц назад

    Огромное спасибо! Твои видео очень помогают

  • @ElianaAsato
    @ElianaAsato 2 месяца назад

    Спасибо за урок, очень понятно объяснили!

  • @m1nd-s7k
    @m1nd-s7k Год назад

    20:50 можно просто написать условие if (arr[i] < min)

    • @catanonimus7
      @catanonimus7 Год назад +5

      Нельзя, это указатель на элемент, а не сам массив

  • @kpanat
    @kpanat Год назад +3

    Это негласное правило по которому вы * пристыковываете с типом или с переменной определяет шарпист Вы или плюсовик. если вы пишете так int* a, то Вы шарпист, а если int *a, то плюсовик... А некоторые пишут так: int * a. Но это тоже плюсовик, но продвинутый. Такая запись подчёркивает тот факт что это именно указатель а не что-то ещё.

    • @ivan_naitoraito
      @ivan_naitoraito 19 дней назад +1

      и выглядит это как умножение int на a.... По-моему бред)

  • @SpaceLexaDnepr
    @SpaceLexaDnepr Год назад +2

    Спасибо

  • @Remington-og3tf
    @Remington-og3tf Год назад +5

    Это было полезно!

  • @TestTest-fi2ok
    @TestTest-fi2ok 8 месяцев назад +4

    Все понятно, кроме одного, где на практике нужно использовать ссылки? В каких случаях?

    • @ivan_naitoraito
      @ivan_naitoraito 19 дней назад

      там, где не нужны указатели 😀

  • @w0njet
    @w0njet Год назад +2

    22:10 у меня код в точь точь как у тебя но минимальный елемент 5 хотя там тоже есть -2. Помоги

    • @baldeg_
      @baldeg_ Год назад +6

      просто он гавнокодер и написал полную залупу, массив всегда передается как указатель , поэтому толку от int *arr нету, если говорить про ссылку на переменную, то это вообще пиздец, так никто не делает, из-за этого только путаница будет в коде

    • @AmarokSKB
      @AmarokSKB 2 месяца назад

      @@baldeg_ он с переменной сделал как пример для пояснения, на деле никто ж не будет на переменную указывать

  • @vadimgreen3738
    @vadimgreen3738 6 месяцев назад

    можно вопрос? я в принципе понял, как работает последний пример. Но в функции в параметрах записано int * arr - получается тип данных - это указатель на int. А сам массив у нас не задан указателем, то есть выделением памяти - он задан просто, без указателя - int arr[]. Почему так? а не изначально int * arr = new int(len) и потом в функции полноправно использовать созданный указатель. Возможно я чего-то не знаю, или не понял. Но уже полгода программировал в универе и вроде бы так было правильно

  • @woomy_squid
    @woomy_squid 6 месяцев назад +4

    Зачем нужны ссылки, если есть указатели?

  • @kookaburru
    @kookaburru 2 года назад +16

    minval(int arr[]) и (int *arr) одно и тоже. Массив всегда передается как указатель.

    • @SolarSystem_sUser
      @SolarSystem_sUser 7 месяцев назад +2

      тоже на этом моменте не понял автора. в каком месте массив начинает занимать место дважды... по идее адрес у него один всегда.

  • @redoboly
    @redoboly 5 месяцев назад

    а можно также с векторами делать надеюсь?

  • @AndriiTurchynRieltorDnipro
    @AndriiTurchynRieltorDnipro Год назад +2

    дякую

  • @Vanek305
    @Vanek305 6 месяцев назад +3

    А как вывести двумерный массив с помощью указателей?и трёхмерный

    • @SpeedCuber______
      @SpeedCuber______ 4 месяца назад

      А ты попробуй сам до этого дойти, ты программист)))0)

  • @deniszaltsberg2127
    @deniszaltsberg2127 Год назад +2

    а зачем нужны вообще ссылки? ну типо у меня есть значение в одной переменной с названием X, и все что дают ссылки это менять значение X меняя Y.

    • @ГусевАлександр-у1л
      @ГусевАлександр-у1л Год назад +1

      Согласен, по сути только для того чтобы не занимать лишнюю память, но в тоже время если я допустим захочу изменять значение которое в себя принимает переменная, отдельно от ссылки. То изменяться будут оба значения и ссылки что в принципе логично и переменной. Тоже самое и с переменной. Сам особо не пойму где можно использовать. Другое дело указатели, реально полезная штука если разобраться.

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

      @@ГусевАлександр-у1л один из вариантов применения - для создания псевдонима переменной. Например, вы дорабатываете чужой код, вам надо доработать код, функцию или метод, а предыдущий программист не сильно заморачивался с именами переменных и вместо rentpay (это просто пример, Оплата ренты) написал имя переменной одной буквой r, соответственно листать весь код и менять везде имя переменной вы не будете, вы просто создаете ссылку на переменную r и работаете с удобным и читаемым именем переменной.

  • @RadaCasian-ep8ht
    @RadaCasian-ep8ht Год назад +5

    Как можно пройти курс c++ у вас ?

    • @AmarokSKB
      @AmarokSKB 2 месяца назад

      на их сайте за дэнбги

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

    Вот 5:11 у Вас же восьмибайтовый адрес переменной ))

    • @novichok3417
      @novichok3417 6 месяцев назад

      8 байт это 8 бит 8 раз получается 64 символа . Там 64 символа?

  • @ФруЛо
    @ФруЛо Месяц назад

    Не понял зачем нужна переменная len ? Почему нельзя указать что i < 5 ? И почему показывает ошибку

    • @xLisiq
      @xLisiq 18 дней назад

      Конкретно тут не нужна, но в целом полезная штука, как задел на будущее, особенно если нужно будет постоянно дёргать эту функцию и переменную в автоматическом режиме.
      Не уверен как в C++ это сделать, но в C# можно было бы записать как int len = array.Length и получить обновляемую при каждом вызове функции переменную, которая переходила бы в void minimal автоматически. Как пример из практики - что-то подобное я делал из List'ов когда писал плагин для одной игры, который получал SteamID64 игроков и сортировал их по количеству убийств/смертей с записью в JSON файл.

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

    В ссылке на переменную нет смысла если мы не используем полиморфизм. Потому что мы получаем фактически другое имя для неё. Это бесполезное действо. Более того вносит путаницу в код. Поэтому так никто не делает.

  • @SolarSystem_sUser
    @SolarSystem_sUser 7 месяцев назад

    не понятно почему созданный массив передается в функцию и там занимает еще раз место. у него меняется адрес? он дублируется? что происходит при передаче массива в функцию, что он занимает еще раз место в памяти... этот момент не раскрыт. имхо.

  • @ЭКОНОМкласс-б4ъ
    @ЭКОНОМкласс-б4ъ Год назад +3

    что такое "len"?
    подскажите пожалуйста в каком уроке его проходили?
    (16:30)

    • @ДианаКривнюк-п9н
      @ДианаКривнюк-п9н Год назад +4

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

    • @ЭКОНОМкласс-б4ъ
      @ЭКОНОМкласс-б4ъ Год назад +3

      @@ДианаКривнюк-п9н благодарю

    • @ЭКОНОМкласс-б4ъ
      @ЭКОНОМкласс-б4ъ Год назад +3

      ааа понял!
      во я туп туп)

  • @martinslepynin7959
    @martinslepynin7959 9 месяцев назад

    всем привет ответьте на вопрос почему if (min>*(arr+i)); происходит смещение указателя а не сложение элемента массива с i

    • @5классвиленкин-ъ4п
      @5классвиленкин-ъ4п 9 месяцев назад

      Потому что никакого элемента массива нет

    • @novichok3417
      @novichok3417 6 месяцев назад

      Потому что arr это адрес первой ячейки массива элемент массива и меет длину 4 байт. Через 4 байт начинается второй элемент массива и переменная i это 4 байта тоесть каждый раз адрес увеличивается на 4 байта (для int, для других типов другая)

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

    не понял, а почему у меня пишутся разные адреса одной и той же ячейки, то есть не как у вас

  • @Непрофессионалымы

    народ почемк я добавил отрицательные числа в массив, но метод минимум выводит лишь минимальное положительное число?

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

      Возможно у тебя unsigned int, что значит беззнаковый int, но тогда бы ты не смог инициализировать переменную отрицательным значением, поэтому ответа на твой вопрос нету)) если ты сделал также как в видео разумеется

    • @Непрофессионалымы
      @Непрофессионалымы Год назад

      @@doctor_livsi_pod_phonk я уже нашел косяк) не помню где был. но спасибо

    • @blackdragon7405
      @blackdragon7405 6 месяцев назад

      @@doctor_livsi_pod_phonkкстати нет если unsigned int передать минусовой Int то он выведет по модулю значения от максимального int вроде:
      unsigned int num = -1;
      std::cout

  • @woomy_squid
    @woomy_squid 6 месяцев назад +1

    Не понял, почему ptrval вывел 20 после обнуления

    • @Gllory
      @Gllory 5 месяцев назад

      Обнулился Только с *, а переменная осталась

  • @solomr2013
    @solomr2013 2 года назад +5

    Гоша, чтобы ты порекомендовал Линукс или виндовс для программирования если выбирать что то одно?

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

      Для программирования FREEBSD там нечему ломаться и нагружать пк

    • @linuxoidovich
      @linuxoidovich Год назад +2

      Каждому удобнее разное, но в линуксе есть удобные пакетные менеджеры, возможность быть на musl, а не glibc, там хорошо работают тайлинговые wm, которые ускоряют разработку и повышают удоство.

  • @raldbthar
    @raldbthar Год назад +41

    Зачем вводить людей в заблуждение, ссылки ничего не хранят, а вот как раз указатели могут хранить адрес. Ссылка это ещё одно название для переменной или alias

    • @Morena-ok8fg
      @Morena-ok8fg Год назад +8

      если бы на ваш коммент, я бы так и не поняла ничего. Благодарюююю)))

    • @Lol_12246
      @Lol_12246 Год назад +5

      Вы случайно не знаете видео или статью где подробнее объясняют эту тему. А то как то хреново объяснил тему. "Просто запомните", даже не объяснил как толком это работает.

    • @ivan_naitoraito
      @ivan_naitoraito 19 дней назад

      привет, вы год назад писали тут, это всё ещё актуально? или все же автор прав? Просто судя по выводу на экране ссылка все же хранила адрес переменной на которую ссылалась. ChatGPT подскзаал следующее: "Компилятор скрывает детали работы ссылки, но, по сути, ссылка внутри реализована как указатель на объект. Она оперирует адресом объекта, но сама по себе не дает прямого доступа к этому адресу."

    • @raldbthar
      @raldbthar 19 дней назад +1

      @@ivan_naitoraito Привет, конечно актуально. В независимости от того как ссылка реализована компилятором, мы, как разработчики, должны использовать ссылку как эту переменную, это просто псевдоним, ещё одно название для переменной, и больше ничего

  • @МишаМасленченко
    @МишаМасленченко 8 месяцев назад

    А C++ плохо не станет если я напишу
    int e = 1
    int &a = e + 1
    ?

    • @novichok3417
      @novichok3417 6 месяцев назад

      Я думаю нет . Выполнение начнётся с права налево : переменная e увеличится на единицу и адрес переменной e запишится в переменную a

  • @Nero22834
    @Nero22834 4 месяца назад

    Так и не понял в чем разница между ссылками и указателями

  • @ЮраНиколаев-ц2в
    @ЮраНиколаев-ц2в Год назад +1

    А нельзя было поставить ссылку на весь массив ?

    • @novichok3417
      @novichok3417 6 месяцев назад

      Адрес перввог элемента и есть ссылка на весь массив

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

    как добавились эти указатели все перепуталось, и простейшие программы теперь вообще не понятны(

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

    можно ли делать игры с движком unity на c++?

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

      Нет unity только с c#, c++ можно использовать в unreal engine

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

      @@aram2010uk спасибо

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

    Здравствуйте, скажите пожалуйста, почему Ваш сайт не открывается?

    • @Arh-s2q
      @Arh-s2q 8 месяцев назад

      Я его взломал

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

    Круто

  • @Александр-к8б9ж
    @Александр-к8б9ж 2 года назад

    Подскажи пожалуйста какой фреймворк выбрать для написания скринера на python для торговли на крипте?

    • @linuxoidovich
      @linuxoidovich Год назад +3

      С нуля писать можно.

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

    Если подумать. Разрядность процессора - 64, значит, в теории, размер оперативной памяти может быть очень большим (тип long, т.к. 8 * 8 = 64).
    Получается, чтобы хранить адрес ячейки памяти необходимо 8 байт. Верно?
    Теперь по поводу ссылок: гораздо нагляднее был бы пример с пользовательсим вводом внутри пользовательской функции, которая принимает параметр-ссылку и ни чего не возвращая, меняет значение по ссылке.

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

    все понял лишний амперсант написал

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

    Я думал, что запись *(val + i ) , где val имеет тип int сместится на адрес слеующей ячейки памяти. А так как int это 4ре байта, то на вторую ячейку из четырёх.
    А для смещения на следующий элемент массива придётся делать
    *( val + i * sizeof( int ) ).
    Теперь сижу и думаю в чём я не прав.

    • @raldbthar
      @raldbthar Год назад +8

      Указатель типа int сам знает на сколько байт ему смещаться при арифметике указателей, компилятор распознает и интерпретирует например *(val + 2) как "добавить к адресу val 2*(sizeof(int)), и считать значение int по полученному адресу с помощью операции разыменования '*'

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

      @@raldbthar логика понятна, спасибо. 🤝🏼

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

    Про указатели и ссылки вообще не понятное объяснение.

  • @parabox3176
    @parabox3176 Год назад +8

    Полностью скопировал код из видео, код не работает. Ни черта не понимаю. Программирование это весело.

    • @amerigovespucci1499
      @amerigovespucci1499 Год назад +3

      chatGPT в помощь

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

      У меня тоже. Исправил ошибку? Если да, помоги пожалуйста.

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

      @@w0njet Неа. Я забил на неё.

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

      ​@@parabox3176я нашел ошибку (chatgpt точнее) ты скорее ошибся когда писал код в функции, по крайней мере я там ошибся. Я написал (*arr + i) а надо было *(arr + i), сорян если я не понятно объяснил

  • @hxntaininja
    @hxntaininja Год назад +5

    Нихуя не понятно

    • @maasimada
      @maasimada 11 месяцев назад

      согласен

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

    22:10 у меня код в точь точь как у тебя но минимальный елемент 5 хотя там тоже есть -2. Помоги

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

      Я нашел ошибку 😂

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

      у меня такое же, в чём была ошибка?@@w0njet

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

      Всё, нашёл в чём проблема) Я вместо i , написал 1

    • @Arh-s2q
      @Arh-s2q 8 месяцев назад

      А я не нашëл

    • @ZxcPudge-i8t
      @ZxcPudge-i8t 7 месяцев назад

      @@Arh-s2q нашел ошибку?