Угу, такая же фигня, у меня после перегрузки функций сразу идёт домашка с ссылками и указателями которые вообще не давали. Посмотрел несколько видео сразу стало понятно что от меня хотят, думаю что весь курс посмотрю.
Спасибо за урок! Отдельно хочу похвалить за очень граммотное построение очередности уроков, для новичка как я, с каждым последующим уроком открываются глаза на новые возможности уже знакомых по прошлым урокам действий. Так же хочу поделиться идеей выполнения предидущих уроков другим уже открывшимся сейчас способом. Так становится понятнее возможность выполнения урока разными, более осмысленными способами.
Вы просто мой спаситель! Учусь в универе и на парах по программирования ничерта не понимаю, а вы так просто и на банальных примерах рассказываете, что невольно думаешь как этого можно было не понять, это же так просто! Огромное вам спасибо за ваш труд! Может пронимаете донаты в качестве благодарности?))))
Кажется у автора присутствует неточность про ссылки. Например если создать указатель на переменную, то у самого указателя и у переменной будут разные адреса. int a=5; int *b = &a; cout
Когда кажется ты лучше крестись, а не пиши глупые комментарии. В телефонной книжке пишем имя Андрей, но храним там телефон Наташи . (что говорит о том, указатель является переменной, хранящей адрес другой переменной.) Если написать на табличке Андрей и повесить её на Игоря то табличка, как ни странно не является человеком с именем Андрей и Игорь (Если же создать ссылку на переменную, то оказывается что адрес переменной и адрес ссылки совпадает, что говорит о том, что ссылка, как ни странно, является самой этой переменной хоть и с другим названием. Вот поэтому ее и разыменовывать не нужно.) Индейцу с именем Соколиный Глаз и Мозг Как У Динозавра советую 7 раз посмотреть урок с 15 : 42 (Соответственно своего отдельного адреса у ссылки нет. Именно поэтому нет указателя на ссылку, ссылки на ссылку, ссылки на пустое место.)
Не всегда для ссылки компилятор будет выделять память. Ссылка скрывает технические подробности. У переменной типа ссылка программист не имеет права взять его адрес. А если попытается, то получит адрес куда указывает эта ссылка. То-есть расположение ссылки в памяти полностью зависит от компилятора.
@@ДильбарМухамедова-щ3я Ну ты тоже, видно, самый умный. Мы конечно благодарны автору за 200+ уроков, но это не значит, что он не может ошибаться. Ссылка в C++ - это просто другой способ доступа к уже существующей переменной. Она фактически становится другим именем для переменной, на которую она ссылается, и используется для обращения к этой переменной. Для ссылки компилятор не выделяет память и адреса у нее нет, а указатель является переменной, которая хранит адрес, и для нее выделяется память со своим адресом. Теперь для умных объясняю: Указателя на ссылку в строгом смысле не существует, а ИМЕННО ЗАПИСЬ int&* p = ... На такое компилятор (Visual Studio) тебе ответит "Использование указателя на ссылку не допускается". То, что автор показал int* ppa = &aref; НЕ ЯВЛЯЕТСЯ, в прямом смысле, указателем на ссылку. Вместо этого, мы работаем с указателем на переменную, на которую ссылается ссылка, как бы странно это не звучало.
Ну кстати, если перед ссылкой при ее выводе, или обращению к ней, поставить амперсант (&), то мы будем работать (выводить) непосредственно с адресом ячейки памяти, а не с данными которые там хранятся. Так же как и в случае с указателем если его не разьеминовывать.
Очередное открытие сделал для себя srand((int)pa); // по цифре указателя на память, она же при каждом пуске прогр. разная. Случайные числа без использования. #include srand(time(NULL));
Большое спасибо за столь хорошее объяснение! Даже, когда уже давно прошел все это, иногда приходится поднимать какие-то знания, и в этом Ваше видео как всегда помогают
@@SimpleCodeIT , непонятно, почему же при присваивании указателю *ppa числа 12, сама переменная изменила значение на 12, ведь указатель *ppa присваивался адрес, где хранится запись о ссылке, а не адрес о переменной, то есть переменная "а" не должна была поменять своего значения.
Здравствуйте! Спасибо большое за Ваши видео! Прекрасные видео! У меня к Вам просьба - не могли бы Вы сделать ролик, поясняющий практическое применение указателей и ссылок. Это практическое применение можно представить себе, если внимательно смотреть и слушать Ваши пояснения, но было бы просто замечательно получить эту информацию в одном ролике в разжеванном, так сказать виде. Те. чтобы ролик, возможно повторяя уже изученное, отвечал на вопрос, не 'Что такое ссылки?', а 'Зачем существуют ссылки', практическая роль ссылок, так сказать. Спасибо еще раз!
Адрес ссылки aref и адрес переменной а - одинаковые, на картинке в paint у Вас ошибка. Мне кажется понятней было бы в уроке сравнивать ссылку с ярлыком на переменную (как Вы это делали ранее) или сказать что ссылка - это по сути псевдоним переменной, т.е. та же переменная. А так на мой взгляд получилось немного путано. Но все равно спасибо! Мне нравятся Ваши уроки.
@@yaolegoleynik Когда говорится о взятии адреса, то надо понимать, что возвращается адрес не на переменную, а на данные, т.е. например на число 5. Переменная это просто имя для ячейки памяти, это имя существует только для компилятора. А сылка это второе имя (псевдоним) для той же самой ячейки, поэтому взятие адреса от переменной и от ссылки вернет один и тот же адрес.
Уроки супер, я в восторге. Только замечание: В предыдущих уроках было хорошо и понятно рассказано как работать с указателями, но...Но ни слова о том, зачем вообще так делать, зачем работать по указателям, вместо имён переменных
Спасибо за ролик, классно объяснил! И не могу не отметить один момент забавный) Автор: "потому что ссылочные типы существуют во всех популярных языках программирование" Golang: "Чо?"
Пока разбирал тему указателей... Столько годных каналов нашел на всю эту тему. Жеесть! Щас столько ребят которые просто срут в уши и ничему не учат что ппц...
Чтобы не мудрить тоннами слов... я просто считаю ссылку константным указателем на объект, который(ref) разыменовывается автоматически(без оператора *). По моему это все, что нужно знать о ссылках. Под капотом компилятора это так и реализовано. И экономия при передаче параметрами огромных объектов, так же точно реализуется передачей указателя, а не копии объекта. Вся разница в отсутствии * и обязательной константности
На 15:55 Вы говорите, что под сслылку выделяется ячейка. Но это не так. Ссылка может быть применена лишь к уже существующему адресу, просто она меняет синтаксическое воплощение этого адреса. Т.е. если вывести на консоль &ppa, то будет выведен адрес ppa (это элемент "ссылка"). И он будет такой же как и адрес переменной а (т.е. если вывести &a)
@@Recon83Vl Я тоже смотрю и понять не могу, если в PPA содержится адрес AREF (не путать с адресом содержащимся в AREF), то разыменовав PPA и присвоив 12 получится, что ссылка должна ссылаться на адрес 12, а это скорее всего AV. @Aleksandr Teplyuk правильно написал, теперь понятно почему в переменной A содержится 12, если конечно это не умный компилятор, но тогда бы было очень запутанно. Хотя чёто я запутался
Прохожу курс, и могу сказать что это прекрасный материал! Простым понятным языком, очень легко и быстро материал ложится в голову, спасибо огромное! У меня в универе скоро начнется работа с windform, пытался найти курс по нему, но там большинство видео о С#, я думаю многим был бы интересен ваш курс по С++ windform)
То есть автор по ходу не сечет в ссылках, но учит других, браво! У него ссылка и переменная на которую она ссылается имеют разный адрес в памяти. Это гениально!)))
Спасибо вам за уроки! Столкнулся с неясностями в книге с ссылками, там они идут раньше указателей(поэтому пришлось посмотреть ещё предыдущие уроки, что дало мне больше ясности гораздо). Стало гораздо понятнее!
Круто! Спасибо, все крайне разжёвано) А всем указателям на не точности автора, учите мат. часть, ссылки под капотом реализованы с помощью указателей и имеют не явное разыменование(автоматическое). 😁
Указатели и ссылки непростая "штуковина" для новичков. Совместно с *битовыми операторами* это чаще используется для низкоуровневого программирования. Практические примеры были лучше для UI (Windows Form), Qt, Wx, OpenGL, DirectX и.т.п. *Но в общем отличный и почти полный, классический и уникальный курс по С++. на рус.* Конечно, все остальное - это уже могут быть доп. курсы.
собственно нужно освоить и 16-ричную систему счисления. там все просто. нужно просто провести аналогию с 10-ричной и представить, что там не 10 символов (цифр), как нам привычно, а 16. И например число 15 там можно отобразить всего одним символом, как число 9 в 10-ричной системе.
Что то не сходиться с теорией, по теории ссылка "ARef" лежит в другой области памяти (имеет другой адрес) на которую указывает указатель "ppA", но на практике: и переменная "А" и ссылка "ARef" находятся по одному адресу, как так??? int A = 5; // переменная "A" cout
Ссылка не хранит в памяти указатель... Это просто альтернативное имя переменной, которое нужно чтобы её можно было передавать в другие области видимости. На 16:50 у тебя нарисовано, что у ссылки и переменной разный адрес в памяти. Это не так, адрес у них одинаковый, потому что это один и тот же объект.
@@SimpleCodeIT у вас очень годные уроки и за это вам честь и хвала, НО...курс по С++ публиковался на протяжении долгого периода времени, сейчас начался курс С#. Так что с такой скоростью уроки по всем этим языкам появятся спустя лет 5 а то и 10
Спасибо за видео, уважаемый Сергей! Уважаемые, я понял, что aref, *pa - это просто новые имена переменной a. А pa, &aref - это имена адреса этой самой переменной a! Всё просто сейчас, хотя раньше был туман!
Не совсем. "pa" - это, в нашем случае, отдельная переменная, которая хранит в себе адрес переменной "a", и для "pa" выделяется отдельная ячейка в памяти. Оператор * в данном случае позволяет получить доступ к данным, которые хранятся по адресу, который хранится в "pa". Т.е. "pa" сам по себе ничего не знает о переменной "a". Так, указатель может также хранить адрес, ни связанный с никакой переменной (адрес динамически выделенного блока памяти, адрес фиксированного аппаратного буфера и т.д.), и оператор * также можно (чисто технически) применить и непосредственно к адресу, например, *0x12345678 = 5; но стоит ли так делать, это уже отдельный вопрос)
Огромное спасибо за ваши уроки, если вдруг кто прочтет то по данному уроку такой вопрос , при выводе в консоль единовременно адреса памяти указателя и адреса памяти ссылки, адреса не совпадаю, это говорит о том что указатель занимает свой уникальный адрес в памяти, а сслыка использует адрес памяти присваимаего значения?
Под ссылку не выделяется выделяется никакая память. Адрес у ссылки ровно такой же, как и у переменной на которую она ссылается. Ссылки в памяти не существует.
насколько я понял, интуитивное различие указателей и ссылок состоит в том, что указатель создает переменную, которая хранит адрес другой переменной, в то время как ссылка создает переменную, которая хранит значение другой переменной по данному адресу наверно
Создание переменной ссылочного типа - это не создание переменной как таковой, а создание нового идентификатора под какой то объект, чаще всего именованный.
Есть ли у ссылок свое место в оперативной памяти? Взятие адреса оперативной памяти у указателя говорит о том что под указатели отводится определенное место в оперативной памяти. В то время как взятие адреса у ссылки возвращает адрес переменной на которую ссылается ссылка. Получается что своего места в оперативной памяти ссылки не имеют?
Про NULL вообще лучше забыть, т.к. при перезагруженной функци, foo(int a) и foo(int *a), если у вас указатель был обнулен с помощью NULL, он конвертируется в Int и будет вызвана функция foo(int a). А оно вам надо?
В отличие от указательной переменной, которая всегда занимает место в памяти, ссылочная переменная может не занимать место в памяти вообще (зависит от реализации компилятора).
Спасибо! Но в объяснении на 16-ой минуте небольшая ошибка. Адрес ссылки или указателя после ссылки/указания на переменную равны адресу той переменной, на которую указывают/ссылаются.
У Вас ошибка! Если указателю присвоить адрес ссылки, то он будет хранить адрес переменной, на которую ссылается ссылка. Потому что ссылка -- это саморазыменовывающийся указатель. И при взятии ее адреса, она возвращает адрес переменной, на которую ссылается. int a = 5; int &ref = a; int *p = &ref; std::cout
UPD: моё утверждение ниже ошибочно, переназначать ссылку после инициализации НЕЛЬЗЯ! Да, можно. Для этого надо писать, например, так: int a = 5, b = 27; int &ra = a; //инициализируем ссылку ra = b; //в таком случае переменная 'a' станет равна 27 &ra = b; //в таком случае мы заставим ссылку 'ra' ссылаться на переменную 'b', которая равна 27
@@BadDanFeeds Чушь не пишите!!! Если вы проинициализировали ссылку ra переменной a, то переназначить на другую переменную НИКАК, можно лишь только значение менять, но не адрес.
@@РоманМороз-д2я Проверьте мой код. Выведите значение ссылки в консоль до переназначения, и после. А ещё лучше, чтобы убедиться что ссылка переназначилась, а не просто передала родительской переменной значение новой, выполните при переназначении префиксный инкремент, а затем сравните обе переменные. Вы увидите, что у 'b' прибавилось 1, а у 'а' - нет, что и будет доказательством возможности переназначения ссылки.
@@РоманМороз-д2я И не забывайте, что при использовании амперсанда при переназначении, вы как раз таки даёте компилятору указание к редактированию значения ссылки, а не ссылаемой переменной. А вот уже без амперсанда вы получите простое присваивание ссылаемой переменной нового значения.
Спасибо, однако странно - почему автор не пользуется в cout манипулятором dec, чтобы не перазапускать программу для ожидания значений адреса до 9 в последней цифре
Работая с одиночными переменными память не экономишь, но приобретаешь гибкость. Экономить начинаешь, работая с массивами, с функциями, с методами классов
Спасибо за урок. Немного не понял про взаимодействие указателей и ссылок. После выполнения &aref = *pa куда будет ссылаться aref? На адрес указателя pa или напрямую на адрес переменной a?
Это как курица = яйцо, но мы не сравниваем их, а присваиваем яйцо курице. То есть это не обычное присваивание, а скрытая перегрузка оператора = короче тут магия...
А нельзя использовать указатель для целей, которые Вы рассказали в конце? Ну тип указатель на объект, вместо ссылки на объект? Я не знаю, просто спрашиваю)
Здравствуйте с удовольствием смотрю ваши уроки, но по поводу ссылки вы объясняете неправильно. Время 15:50 в оперативной памяти не выделяется никакого адреса под ссылку и ссылка никакого значения не хранит, ещё в момент компиляции наша ссылка заменяется на тот адрес на который она ссылается. Вы правильно объясняли, что за каждым именем которое мы даём переменным или функции стоит адрес в памяти. Поэтому когда мы объявили и инициализировали переменную 'а', а потом создали ссылку на неё 'refa', то получилось всё равно что мы к лэйбику 'a' за которым стоит адрес в оперативной памяти наклеили ещё один лэйбик 'refa', на тот же самый адрес. Как-то так. :)
Если сделать две программы, где в первой есть переменная и мы знаем еë адрес, а во второй делаем переменную-указатель такого же типа и указываем ей адрес переменной в памяти и вывести еë в консоль, будет ли значение переменной первой программы выводиться во второй программе?
Нет, адреса программы зависят от области памяти куда загрузит ее ОС. Если же речь идет о программах выполняемых одновременно, то их адресное пространство изолировано друг от друга. Нельзя из одной программы читать память другой.
Как я решил до просмотра видео: #include using namespace std; int a, b, da; void F(int *pa,int *pb) { (*pa) = b; (*pb) = da; } void main() { cin >> a >> b; da = a; cout
@@theyandwe9047Немного не понимаю.Ты предлагаешь убрать переменную da и просто написать (*pb)=a; (если да,то так код сработает некорректно,если нет можешь скинуть переделанный код?)
Да не нужны эти дурацкие скобки у указателей в функции. Они только для инкремента с постфиксом используются. Либо можно написать *a=*a+1; , это аналог (*a)++; или как вариант еще можно так ++*a;
Так ссылка же хранит в себе не только данные переменной, но и адрес, почему в паинте вы указали, что ссылка хранит в себе свой адрес, или я что то недопонял?
Интересно, есть ли возможность получить указатель на ссылку? Злой c++ при попытке получить указатель на ссылку ra методом &ra выдаёт указатель на a, на которую и ссылается ra. Я, конечно, смог хакнуть её, но чё-то я сомневаюсь в правильности такого способа... int main(int argc, char* argv[]) { int a = 10, b = 777; int &ra = a; int t = 0; cout
А вот, с константами уже что-то не то... Судя по всему, все константы в скрипте компилятор ещё при компиляции на конкретные значения подменяет... Но в оперативной памяти они, походу, всё равно есть... Зачем только? int main(int argc, char* argv[]) { const int a = 7835; int b = 0; int *r = &b; cout
Прошу прощения, константы кого? Кто такой сук? Или это слово подразумевалось как обращение? Учитывая отсутствие запятых с обоих сторон этого слова, я, пожалуй, буду расценивать его как прилагательное... А теперь к вашему замечанию... Если вы не поняли, что именно я делал, и для чего я это делал, то это исключительно ваши проблемы...
Ну, у меня он содержал адрес переменной, на которую ссылается ссылка... int a = 5; int &ra = a; int *pra = &ra; У меня в таком случае в pra был тот же адрес, что и в &a. Хотя, "хакнуть" эту ссылку, получить её адрес, и перезаписать адрес, хранящийся в ссылке на адрес другой переменной я, всё-таки, смог, о чём написал в своём комменте...
Я "взломал" указатель и записал в него адрес другой переменной, в результате чего указатель указывал не на ту переменную, на которую он указывал изначально, чего он изначально не позволяет (по крайней мере, насколько я знаю)... Подробнее я описал в другом своём комментарии... Если в твоих интересах, что-бы я признал свою неправоту, то мог бы хоть поискать в каких-нибудь словарях значения слова "взломать" и указать на несоответствие моего использования данного слова его лексическому значению... P.S Ты серьёзно думал, что я не знаю, как переводится слово "Hack"?
Можешь сказать, я вот посмотрел все 50 выпусков, это все основы я могу перейдти на джаву хочу купить подписку javarush или стоит уже здесь научиться что-бы потом было легче?
на javarush сложно, а тут легко для меня лучшее я здесь онову узнаю, потом пойду туда как раз если на работу буду устрайвыться будет знания c++ это не повредит))
чему научил универ,так это тому, что надо всему учиться самому. Спасибовам
Даа, так же.
Угу, такая же фигня, у меня после перегрузки функций сразу идёт домашка с ссылками и указателями которые вообще не давали. Посмотрел несколько видео сразу стало понятно что от меня хотят, думаю что весь курс посмотрю.
Жизаа
согласен
@@iofakh Как успехи? Посмотрел весь курс?
Очень понравилось что в конце Вы привели пример где это пригодится, спасибо за урок!)
a tip : watch series at flixzone. Been using it for watching a lot of movies lately.
@Ricky Dominik definitely, have been watching on Flixzone} for months myself =)
Спасибо за урок!
Отдельно хочу похвалить за очень граммотное построение очередности уроков, для новичка как я, с каждым последующим уроком открываются глаза на новые возможности уже знакомых по прошлым урокам действий.
Так же хочу поделиться идеей выполнения предидущих уроков другим уже открывшимся сейчас способом. Так становится понятнее возможность выполнения урока разными, более осмысленными способами.
Вы просто мой спаситель! Учусь в универе и на парах по программирования ничерта не понимаю, а вы так просто и на банальных примерах рассказываете, что невольно думаешь как этого можно было не понять, это же так просто! Огромное вам спасибо за ваш труд! Может пронимаете донаты в качестве благодарности?))))
патреон у него есть. он отдельный видос вроде делал по этому поводу
@@brain1340 спасибочки))
@Stalker from Pripyat Юра,ты?
Мотивирует фраза "получить что-то оттуда, откуда нам нельзя"
Очень хорошая подача материала, знай, что ты помог Огромному количеству людей!
Кажется у автора присутствует неточность про ссылки.
Например если создать указатель на переменную, то у самого указателя и у переменной будут разные адреса.
int a=5;
int *b = &a;
cout
Когда кажется ты лучше крестись, а не пиши глупые комментарии. В телефонной книжке пишем имя Андрей, но храним там телефон Наташи .
(что говорит о том, указатель является переменной, хранящей адрес другой переменной.) Если написать на табличке Андрей и повесить её на Игоря то табличка, как ни странно не является человеком с именем Андрей и Игорь (Если же создать ссылку на переменную, то оказывается что адрес переменной и адрес ссылки совпадает, что говорит о том, что ссылка, как ни странно, является самой этой переменной хоть и с другим названием. Вот поэтому ее и разыменовывать не нужно.) Индейцу с именем Соколиный Глаз и Мозг Как У Динозавра советую 7 раз посмотреть урок с 15 : 42 (Соответственно своего отдельного адреса у ссылки нет. Именно поэтому нет указателя на ссылку, ссылки на ссылку, ссылки на пустое место.)
Всё верно. Ссылки правильней воспринимать как псевдонимы для переменных. Если бы автор в конце видео попробовал вывести указатели pa и ppa (cout
Не всегда для ссылки компилятор будет выделять память. Ссылка скрывает технические подробности. У переменной типа ссылка программист не имеет права взять его адрес. А если попытается, то получит адрес куда указывает эта ссылка. То-есть расположение ссылки в памяти полностью зависит от компилятора.
@@ДильбарМухамедова-щ3я Ну ты тоже, видно, самый умный. Мы конечно благодарны автору за 200+ уроков, но это не значит, что он не может ошибаться. Ссылка в C++ - это просто другой способ доступа к уже существующей переменной. Она фактически становится другим именем для переменной, на которую она ссылается, и используется для обращения к этой переменной.
Для ссылки компилятор не выделяет память и адреса у нее нет, а указатель является переменной, которая хранит адрес, и для нее выделяется память со своим адресом.
Теперь для умных объясняю:
Указателя на ссылку в строгом смысле не существует, а ИМЕННО ЗАПИСЬ int&* p = ... На такое компилятор (Visual Studio) тебе ответит "Использование указателя на ссылку не допускается".
То, что автор показал int* ppa = &aref; НЕ ЯВЛЯЕТСЯ, в прямом смысле, указателем на ссылку. Вместо этого, мы работаем с указателем на переменную, на которую ссылается ссылка, как бы странно это не звучало.
@@ГлебПастухов-л7с Млин, сам до всего этого допёр, а потом только нашёл комменты) Лучше поздно чем никогда конечно) Спасибо за инфу)))
Ну кстати, если перед ссылкой при ее выводе, или обращению к ней, поставить амперсант (&), то мы будем работать (выводить) непосредственно с адресом ячейки памяти, а не с данными которые там хранятся. Так же как и в случае с указателем если его не разьеминовывать.
(6:10) Так заодно надо было и cout
Очередное открытие сделал для себя
srand((int)pa); // по цифре указателя на память, она же при каждом пуске прогр. разная.
Случайные числа без использования.
#include
srand(time(NULL));
Лол. Ты прав так реально можно рандомить числа
круто
На уме способ поприкольнее
с помощью clock(), string, to_string, и обратно
Большое спасибо за столь хорошее объяснение! Даже, когда уже давно прошел все это, иногда приходится поднимать какие-то знания, и в этом Ваше видео как всегда помогают
Пожалуйста!
@@SimpleCodeIT , непонятно, почему же при присваивании указателю *ppa числа 12, сама переменная изменила значение на 12, ведь указатель *ppa присваивался адрес, где хранится запись о ссылке, а не адрес о переменной, то есть переменная "а" не должна была поменять своего значения.
так его же разыменовали
#ссылки #указатели #SimpleCode #урокипрограммирования
Здравствуйте! Спасибо большое за Ваши видео! Прекрасные видео! У меня к Вам просьба - не могли бы Вы сделать ролик, поясняющий практическое применение указателей и ссылок. Это практическое применение можно представить себе, если внимательно смотреть и слушать Ваши пояснения, но было бы просто замечательно получить эту информацию в одном ролике в разжеванном, так сказать виде. Те. чтобы ролик, возможно повторяя уже изученное, отвечал на вопрос, не 'Что такое ссылки?', а 'Зачем существуют ссылки', практическая роль ссылок, так сказать. Спасибо еще раз!
Адрес ссылки aref и адрес переменной а - одинаковые, на картинке в paint у Вас ошибка. Мне кажется понятней было бы в уроке сравнивать ссылку с ярлыком на переменную (как Вы это делали ранее) или сказать что ссылка - это по сути псевдоним переменной, т.е. та же переменная. А так на мой взгляд получилось немного путано. Но все равно спасибо! Мне нравятся Ваши уроки.
да заметил.. отладчике одинаковые адреса!
Вы спасли мой мозг, спасибо огромное а то я сломался
@@yaolegoleynik Когда говорится о взятии адреса, то надо понимать, что возвращается адрес не на переменную, а на данные, т.е. например на число 5. Переменная это просто имя для ячейки памяти, это имя существует только для компилятора. А сылка это второе имя (псевдоним) для той же самой ячейки, поэтому взятие адреса от переменной и от ссылки вернет один и тот же адрес.
@周正 &ppa возвращает адрес ячейки, где хранится сам указатель, я правильно понял?
@@anonim1788 верно, у указателя есть собственная ячейка памяти, а у ссылки адрес тот же, что и у переменной
Благодарю за Ваши уроки, Сергей!
* Самые понятные, видео уроки по c++, на всём (RU) youtube *
Я конечно все понимаю, но накручивать это уже не хорошо если честно...
Уроки супер, я в восторге. Только замечание:
В предыдущих уроках было хорошо и понятно рассказано как работать с указателями, но...Но ни слова о том, зачем вообще так делать, зачем работать по указателям, вместо имён переменных
Спасибо за ролик, классно объяснил!
И не могу не отметить один момент забавный)
Автор: "потому что ссылочные типы существуют во всех популярных языках программирование"
Golang: "Чо?"
Пока разбирал тему указателей... Столько годных каналов нашел на всю эту тему.
Жеесть!
Щас столько ребят которые просто срут в уши и ничему не учат что ппц...
с фразы "Забавно, не так ли?" меня вынесло. Интонация 10 из 10
дошел до дружественных функций, забыл в чем отличие указателей от ссылок, пересмотрел урок = профит)) спасибо еще раз!
Чтобы не мудрить тоннами слов... я просто считаю ссылку константным указателем на объект, который(ref) разыменовывается автоматически(без оператора *). По моему это все, что нужно знать о ссылках. Под капотом компилятора это так и реализовано. И экономия при передаче параметрами огромных объектов, так же точно реализуется передачей указателя, а не копии объекта. Вся разница в отсутствии * и обязательной константности
На 15:55 Вы говорите, что под сслылку выделяется ячейка. Но это не так. Ссылка может быть применена лишь к уже существующему адресу, просто она меняет синтаксическое воплощение этого адреса. Т.е. если вывести на консоль &ppa, то будет выведен адрес ppa (это элемент "ссылка"). И он будет такой же как и адрес переменной а (т.е. если вывести &a)
@@Recon83Vl Я тоже смотрю и понять не могу, если в PPA содержится адрес AREF (не путать с адресом содержащимся в AREF), то разыменовав PPA и присвоив 12 получится, что ссылка должна ссылаться на адрес 12, а это скорее всего AV. @Aleksandr Teplyuk правильно написал, теперь понятно почему в переменной A содержится 12, если конечно это не умный компилятор, но тогда бы было очень запутанно. Хотя чёто я запутался
Прохожу курс, и могу сказать что это прекрасный материал!
Простым понятным языком, очень легко и быстро материал ложится в голову, спасибо огромное!
У меня в универе скоро начнется работа с windform, пытался найти курс по нему, но там большинство видео о С#, я думаю многим был бы интересен ваш курс по С++ windform)
Отличный урок, затронули всё, Сергей спасибо!
Тяжелый, трудный для понимания урок, но мне это очень очень очень нужно научиться работать с памятью напрямую. Огромное спасибо!
То есть автор по ходу не сечет в ссылках, но учит других, браво! У него ссылка и переменная на которую она ссылается имеют разный адрес в памяти. Это гениально!)))
ну если знаеш обясни плз:))
16:50 лектор оговорился, адресс указателя будет указывать на адресс переменной, а не адресс ссылки.
Кстати, да. Я только что проверил, так и есть
Спасибо за урок.
Спасибо вам за уроки! Столкнулся с неясностями в книге с ссылками, там они идут раньше указателей(поэтому пришлось посмотреть ещё предыдущие уроки, что дало мне больше ясности гораздо). Стало гораздо понятнее!
Круто! Спасибо, все крайне разжёвано) А всем указателям на не точности автора, учите мат. часть, ссылки под капотом реализованы с помощью указателей и имеют не явное разыменование(автоматическое). 😁
Друг, ты лучший 👍💯 теперь я с легкостью переделаю свой ранее нерабочий код (раньше не понимал почему) для управления квадрокоптером
Очень понятный видео урок ,спасибо
Указатели и ссылки непростая "штуковина" для новичков. Совместно с *битовыми операторами* это чаще используется для низкоуровневого программирования. Практические примеры были лучше для UI (Windows Form), Qt, Wx, OpenGL, DirectX и.т.п. *Но в общем отличный и почти полный, классический и уникальный курс по С++. на рус.* Конечно, все остальное - это уже могут быть доп. курсы.
Узнал больше, чем в своей шараге.
Очень хорошее объяснение! Спасибо!
Хороший урок, спасибо!
собственно нужно освоить и 16-ричную систему счисления. там все просто. нужно просто провести аналогию с 10-ричной и представить, что там не 10 символов (цифр), как нам привычно, а 16. И например число 15 там можно отобразить всего одним символом, как число 9 в 10-ричной системе.
Отличный урок!
16:00 у ссылки нет адреса!!! Строка 19 : int *ppa=&aref -- вы берете не адрес ссылки, а через ссылку адрес самой переменной "а"
Хм, уверен?
Ага. На 14:09 в 17й строке резко поменялось значение ссылки. Теперь в неё поместили адрес указателя pa. Из-за этого путаница возникает.
@@crackall1946 да. Достаточно убедиться в этом на собственном опыте.
int a = 5;
int& refa = a;
cout
Спасибо! Прекрасный и понятный урок
На 16:35 ошибка. в 'ppa' мы не помещаем адрес aref. В 'ppa' будет на самом деле храниться адрес переменной 'a'.
спасибо!
спасибо, зашел повторить
Что то не сходиться с теорией, по теории ссылка "ARef" лежит в другой области памяти (имеет другой адрес) на которую указывает указатель "ppA", но на практике: и переменная "А" и ссылка "ARef" находятся по одному адресу, как так???
int A = 5; // переменная "A"
cout
Вы правы, у ссылки aRef такой же адрес как у переменной a.
На 7:40 в операторе cout прописан "*ра =" (разыменованный указатель ) а выводится на консоль ра
спасибо за урок!
Спасибо за урок!
Хм, а можно ли устроить рекурсию из указателей на ссылку?)
Ссылка не хранит в памяти указатель... Это просто альтернативное имя переменной, которое нужно чтобы её можно было передавать в другие области видимости.
На 16:50 у тебя нарисовано, что у ссылки и переменной разный адрес в памяти. Это не так, адрес у них одинаковый, потому что это один и тот же объект.
топовое объяснение!!!
Обожаю программировать на с+++.Спасибо вам огромное за уроки!!!Будут ли видео по с#
?
Пожалуйста =) Будет много чего. C#, java, html,css,javascript, sql, разработка под android - это как минимум.
@@SimpleCodeIT у вас очень годные уроки и за это вам честь и хвала, НО...курс по С++ публиковался на протяжении долгого периода времени, сейчас начался курс С#. Так что с такой скоростью уроки по всем этим языкам появятся спустя лет 5 а то и 10
@@Артём-р1ь7ф может у него мало времени, он и так делает такие годные уроки в которых всё объясняет БЕСПЛАТНО.
Как успехи?
@@SaffronChipMCPE А у тебя как успехи?
Спасибо за видео, уважаемый Сергей! Уважаемые, я понял, что aref, *pa - это просто новые имена переменной a. А pa, &aref - это имена адреса этой самой переменной a! Всё просто сейчас, хотя раньше был туман!
попридержи эту мысль! главное не растрясти, вечером гляну!
Не совсем.
"pa" - это, в нашем случае, отдельная переменная, которая хранит в себе адрес переменной "a", и для "pa" выделяется отдельная ячейка в памяти. Оператор * в данном случае позволяет получить доступ к данным, которые хранятся по адресу, который хранится в "pa". Т.е. "pa" сам по себе ничего не знает о переменной "a". Так, указатель может также хранить адрес, ни связанный с никакой переменной (адрес динамически выделенного блока памяти, адрес фиксированного аппаратного буфера и т.д.), и оператор * также можно (чисто технически) применить и непосредственно к адресу, например,
*0x12345678 = 5;
но стоит ли так делать, это уже отдельный вопрос)
Супер 🙌
Огромное спасибо за ваши уроки, если вдруг кто прочтет то по данному уроку такой вопрос , при выводе в консоль единовременно адреса памяти указателя и адреса памяти ссылки, адреса не совпадаю, это говорит о том что указатель занимает свой уникальный адрес в памяти, а сслыка использует адрес памяти присваимаего значения?
привет из 2023. Спасибо большое за уроки!
Спасибо!🥰🥰🥰
Под ссылку не выделяется выделяется никакая память. Адрес у ссылки ровно такой же, как и у переменной на которую она ссылается. Ссылки в памяти не существует.
Сначала хотел написать, что звучит как бред, но потом сходил проверил - да, всё так и есть) aRef и a имеют одинаковый адрес в памяти.
насколько я понял, интуитивное различие указателей и ссылок состоит в том, что указатель создает переменную, которая хранит адрес другой переменной, в то время как ссылка создает переменную, которая хранит значение другой переменной по данному адресу
наверно
Создание переменной ссылочного типа - это не создание переменной как таковой, а создание нового идентификатора под какой то объект, чаще всего именованный.
Очень понятно и хорошо объяснено! Я счастлив :)
Спасибо Сергей! (  ̄³ ̄ )
еее, 50 урок)))
на 13:55 для взрыва мозга можно было написать и '\0', что уж скромничать)
Есть ли у ссылок свое место в оперативной памяти? Взятие адреса оперативной памяти у указателя говорит о том что под указатели отводится определенное место в оперативной памяти. В то время как взятие адреса у ссылки возвращает адрес переменной на которую ссылается ссылка. Получается что своего места в оперативной памяти ссылки не имеют?
Про NULL вообще лучше забыть, т.к. при перезагруженной функци, foo(int a) и foo(int *a), если у вас указатель был обнулен с помощью NULL, он конвертируется в Int и будет вызвана функция foo(int a). А оно вам надо?
Спасибо.
Спасибо
ссылка на ссылке и ссылкой погоняет )
Спасибо!
//посмотреть на адреса ссылок и указателей
int a = 5;
int &aRef = a;
int *paRef = &aRef;
cout
В отличие от указательной переменной, которая всегда занимает место в памяти, ссылочная переменная может не занимать место в памяти вообще (зависит от реализации компилятора).
Разве ссылки имеют собственный адрес в памяти?
Спасибо! Но в объяснении на 16-ой минуте небольшая ошибка. Адрес ссылки или указателя после ссылки/указания на переменную равны адресу той переменной, на которую указывают/ссылаются.
но значение адреса указателя, такое же как у переменной
У Вас ошибка! Если указателю присвоить адрес ссылки, то он будет хранить адрес переменной, на которую ссылается ссылка. Потому что ссылка -- это саморазыменовывающийся указатель. И при взятии ее адреса, она возвращает адрес переменной, на которую ссылается.
int a = 5;
int &ref = a;
int *p = &ref;
std::cout
а у меня вопрос зачем ссылки если есть указатели даже указателями можно реализовать разименавания ??
Ссылки полезны в функциях,их удобнее использовать.
почему так мало подписчиков? это же актуальные темы.
Скажите пожалуйста, а можно ли сделать так, что бы ссылка после инициализации ссылалась на другую переменную (объект)?
UPD: моё утверждение ниже ошибочно, переназначать ссылку после инициализации НЕЛЬЗЯ!
Да, можно. Для этого надо писать, например, так:
int a = 5, b = 27;
int &ra = a; //инициализируем ссылку
ra = b; //в таком случае переменная 'a' станет равна 27
&ra = b; //в таком случае мы заставим ссылку 'ra' ссылаться на переменную 'b', которая равна 27
@@BadDanFeeds Чушь не пишите!!! Если вы проинициализировали ссылку ra переменной a, то переназначить на другую переменную НИКАК, можно лишь только значение менять, но не адрес.
@@РоманМороз-д2я Проверьте мой код. Выведите значение ссылки в консоль до переназначения, и после. А ещё лучше, чтобы убедиться что ссылка переназначилась, а не просто передала родительской переменной значение новой, выполните при переназначении префиксный инкремент, а затем сравните обе переменные. Вы увидите, что у 'b' прибавилось 1, а у 'а' - нет, что и будет доказательством возможности переназначения ссылки.
@@РоманМороз-д2я И не забывайте, что при использовании амперсанда при переназначении, вы как раз таки даёте компилятору указание к редактированию значения ссылки, а не ссылаемой переменной. А вот уже без амперсанда вы получите простое присваивание ссылаемой переменной нового значения.
@@BadDanFeeds Вы для начала попробуйте скомпилировать такой код!!!
int a = 5, b = 27;
int &ra = a;
&ra = b;
рахмет брат
А для указателей выделяется ячейка в памяти?
Спасибо, однако странно - почему автор не пользуется в cout манипулятором dec, чтобы не перазапускать программу для ожидания значений адреса до 9 в последней цифре
Нам на лекциях говорили, что ссылка это что-то типа "псевдонима" переменной, поэтому для неё не требуется доп. память.
Получается это не так?
ну если она есть переменная и хранит дугой адрес (0:55), то да, уже не так
@@TheWladberlin int a = 1;
int& aref = a;
cout
Немного не понятно, как мы экономим память занимая в нем вместо одной,- три ячейки: указатель-ссылка-содержимое.
Работая с одиночными переменными память не экономишь, но приобретаешь гибкость.
Экономить начинаешь, работая с массивами, с функциями, с методами классов
Можно ли создать массив помощью арифметики указателей? Если да, то у него не будет имени и можно ли тогда его назвать скрытым массивом?
офигеть, а я по незнанию думал, что инициализация и объявление переменной это одно и тоже ....
Спасибо за урок. Немного не понял про взаимодействие указателей и ссылок. После выполнения &aref = *pa куда будет ссылаться aref? На адрес указателя pa или напрямую на адрес переменной a?
на адрес переменной а
Ссылка я так понял реализована больше на уровне компилятора, а указатель ближе к железу процессора
Это как курица = яйцо, но мы не сравниваем их, а присваиваем яйцо курице. То есть это не обычное присваивание, а скрытая перегрузка оператора = короче тут магия...
А нельзя использовать указатель для целей, которые Вы рассказали в конце? Ну тип указатель на объект, вместо ссылки на объект? Я не знаю, просто спрашиваю)
У ссылки нет адреса!
Здравствуйте с удовольствием смотрю ваши уроки, но по поводу ссылки вы объясняете неправильно. Время 15:50 в оперативной памяти не выделяется никакого адреса под ссылку и ссылка никакого значения не хранит, ещё в момент компиляции наша ссылка заменяется на тот адрес на который она ссылается. Вы правильно объясняли, что за каждым именем которое мы даём переменным или функции стоит адрес в памяти. Поэтому когда мы объявили и инициализировали переменную 'а', а потом создали ссылку на неё 'refa', то получилось всё равно что мы к лэйбику 'a' за которым стоит адрес в оперативной памяти наклеили ещё один лэйбик 'refa', на тот же самый адрес. Как-то так. :)
Если сделать две программы, где в первой есть переменная и мы знаем еë адрес, а во второй делаем переменную-указатель такого же типа и указываем ей адрес переменной в памяти и вывести еë в консоль, будет ли значение переменной первой программы выводиться во второй программе?
Нет, адреса программы зависят от области памяти куда загрузит ее ОС. Если же речь идет о программах выполняемых одновременно, то их адресное пространство изолировано друг от друга. Нельзя из одной программы читать память другой.
Спасибо.
Спасибо братан !
Мне кажется для более понятного нужно было показать на калькуляторе, то есть 006FFBB0+1 == 7338928+1
Как я решил до просмотра видео:
#include
using namespace std;
int a, b, da;
void F(int *pa,int *pb)
{
(*pa) = b;
(*pb) = da;
}
void main()
{
cin >> a >> b;
da = a;
cout
@@theyandwe9047Немного не понимаю.Ты предлагаешь убрать переменную da и просто написать (*pb)=a; (если да,то так код сработает некорректно,если нет можешь скинуть переделанный код?)
Да не нужны эти дурацкие скобки у указателей в функции. Они только для инкремента с постфиксом используются. Либо можно написать *a=*a+1; , это аналог (*a)++; или как вариант еще можно так ++*a;
Так ссылка же хранит в себе не только данные переменной, но и адрес, почему в паинте вы указали, что ссылка хранит в себе свой адрес, или я что то недопонял?
Интересно, есть ли возможность получить указатель на ссылку? Злой c++ при попытке получить указатель на ссылку ra методом &ra выдаёт указатель на a, на которую и ссылается ra. Я, конечно, смог хакнуть её, но чё-то я сомневаюсь в правильности такого способа...
int main(int argc, char* argv[]) {
int a = 10, b = 777;
int &ra = a;
int t = 0;
cout
А вот, с константами уже что-то не то... Судя по всему, все константы в скрипте компилятор ещё при компиляции на конкретные значения подменяет... Но в оперативной памяти они, походу, всё равно есть... Зачем только?
int main(int argc, char* argv[]) {
const int a = 7835;
int b = 0;
int *r = &b;
cout
Прошу прощения, константы кого? Кто такой сук? Или это слово подразумевалось как обращение? Учитывая отсутствие запятых с обоих сторон этого слова, я, пожалуй, буду расценивать его как прилагательное...
А теперь к вашему замечанию... Если вы не поняли, что именно я делал, и для чего я это делал, то это исключительно ваши проблемы...
мне тоже интересно , как узнать адрес ссылки , но без использования хака?
как я понял ссылка ето переменная которая может менять свой адрес во время жизни
Довольно хуево ты понял )
Почему при передаче адреса переменной в ссылку,и вывод этой ссылки на экран,выводит значение переменной,а не ее адрес?
Прошло 4 месяца,вопрос все еще актуален))))
Таково устройство ссылок. Не буду вдаваться в сложности устройства языка C++, просто скажу, что:
"cout
А указатель содержит в себе адрес ссылки ? Спасибо.
Ну, у меня он содержал адрес переменной, на которую ссылается ссылка...
int a = 5;
int &ra = a;
int *pra = &ra;
У меня в таком случае в pra был тот же адрес, что и в &a. Хотя, "хакнуть" эту ссылку, получить её адрес, и перезаписать адрес, хранящийся в ссылке на адрес другой переменной я, всё-таки, смог, о чём написал в своём комменте...
Даниил Белов «Хакнуть» (от англ. “Hack”) переводится, как взломать, так что же ты там взламываешь?
Я "взломал" указатель и записал в него адрес другой переменной, в результате чего указатель указывал не на ту переменную, на которую он указывал изначально, чего он изначально не позволяет (по крайней мере, насколько я знаю)... Подробнее я описал в другом своём комментарии... Если в твоих интересах, что-бы я признал свою неправоту, то мог бы хоть поискать в каких-нибудь словарях значения слова "взломать" и указать на несоответствие моего использования данного слова его лексическому значению...
P.S Ты серьёзно думал, что я не знаю, как переводится слово "Hack"?
Можешь сказать, я вот посмотрел все 50 выпусков, это все основы я могу перейдти на джаву хочу купить подписку javarush или стоит уже здесь научиться что-бы потом было легче?
Если хочешь java - его сразу и учи.
на javarush сложно, а тут легко для меня лучшее я здесь онову узнаю, потом пойду туда как раз если на работу буду устрайвыться будет знания c++ это не повредит))
я уже после этого решил)
Javarush - вроде неплохо, но очень затянуто, убьешь кучу времени
@@xrustik4948 лучше с такой грамматностью никуда тебе не устраиваться
9:00
А нельзя просто указатель на объект передавать вместо ссылки?