мне нравится как объясняет автор, лишь на объяснениях автора пока у меня выходит писать код, делаю задачи озвученную автором, код у меня иногда выходит не такой же как у автора, но работает, почувствовал что уже программист хах, сверил осмыслил переписал
Хорошей аналогией адреса является номер почтового ящика... Это просто число. Но надо иметь ввиду что эти номера идут подряд от 0. Память в компе это нумерованные ячейки по 1 байту которые идут подряд. Если мы указываем адрес то мы говорим что в ячейке с таким номером лежат наши данные. Точнее данные лежат в ячейках памяти начиная с такого-то номера отсчитанные от 0. Потому что данные не всегда занимают 1 байт а обычно больше и потому занимают не 1 ячейку, а больше. Но эти ячейки всегда начинаются с адреса памяти этих данных. Ничего сложного в адресах нет. Это оч простая вещь если понять. Просто этих ячеек памяти в компе дофига и потому числа получаются оч большие...
уфффф.. наконец-таки я понял зачем в функциях получаемых из IDA куча лишних параметров вместе с указателями... наконец-таки понял что такое указатель и как с ним играть.. авесоме..
Это негласное правило по которому вы * пристыковываете с типом или с переменной определяет шарпист Вы или плюсовик. если вы пишете так int* a, то Вы шарпист, а если int *a, то плюсовик... А некоторые пишут так: int * a. Но это тоже плюсовик, но продвинутый. Такая запись подчёркивает тот факт что это именно указатель а не что-то ещё.
просто он гавнокодер и написал полную залупу, массив всегда передается как указатель , поэтому толку от int *arr нету, если говорить про ссылку на переменную, то это вообще пиздец, так никто не делает, из-за этого только путаница будет в коде
можно вопрос? я в принципе понял, как работает последний пример. Но в функции в параметрах записано int * arr - получается тип данных - это указатель на int. А сам массив у нас не задан указателем, то есть выделением памяти - он задан просто, без указателя - int arr[]. Почему так? а не изначально int * arr = new int(len) и потом в функции полноправно использовать созданный указатель. Возможно я чего-то не знаю, или не понял. Но уже полгода программировал в универе и вроде бы так было правильно
Согласен, по сути только для того чтобы не занимать лишнюю память, но в тоже время если я допустим захочу изменять значение которое в себя принимает переменная, отдельно от ссылки. То изменяться будут оба значения и ссылки что в принципе логично и переменной. Тоже самое и с переменной. Сам особо не пойму где можно использовать. Другое дело указатели, реально полезная штука если разобраться.
@@ГусевАлександр-у1л один из вариантов применения - для создания псевдонима переменной. Например, вы дорабатываете чужой код, вам надо доработать код, функцию или метод, а предыдущий программист не сильно заморачивался с именами переменных и вместо rentpay (это просто пример, Оплата ренты) написал имя переменной одной буквой r, соответственно листать весь код и менять везде имя переменной вы не будете, вы просто создаете ссылку на переменную r и работаете с удобным и читаемым именем переменной.
Конкретно тут не нужна, но в целом полезная штука, как задел на будущее, особенно если нужно будет постоянно дёргать эту функцию и переменную в автоматическом режиме. Не уверен как в C++ это сделать, но в C# можно было бы записать как int len = array.Length и получить обновляемую при каждом вызове функции переменную, которая переходила бы в void minimal автоматически. Как пример из практики - что-то подобное я делал из List'ов когда писал плагин для одной игры, который получал SteamID64 игроков и сортировал их по количеству убийств/смертей с записью в JSON файл.
В ссылке на переменную нет смысла если мы не используем полиморфизм. Потому что мы получаем фактически другое имя для неё. Это бесполезное действо. Более того вносит путаницу в код. Поэтому так никто не делает.
не понятно почему созданный массив передается в функцию и там занимает еще раз место. у него меняется адрес? он дублируется? что происходит при передаче массива в функцию, что он занимает еще раз место в памяти... этот момент не раскрыт. имхо.
Потому что arr это адрес первой ячейки массива элемент массива и меет длину 4 байт. Через 4 байт начинается второй элемент массива и переменная i это 4 байта тоесть каждый раз адрес увеличивается на 4 байта (для int, для других типов другая)
Возможно у тебя unsigned int, что значит беззнаковый int, но тогда бы ты не смог инициализировать переменную отрицательным значением, поэтому ответа на твой вопрос нету)) если ты сделал также как в видео разумеется
@@doctor_livsi_pod_phonkкстати нет если unsigned int передать минусовой Int то он выведет по модулю значения от максимального int вроде: unsigned int num = -1; std::cout
Каждому удобнее разное, но в линуксе есть удобные пакетные менеджеры, возможность быть на musl, а не glibc, там хорошо работают тайлинговые wm, которые ускоряют разработку и повышают удоство.
Зачем вводить людей в заблуждение, ссылки ничего не хранят, а вот как раз указатели могут хранить адрес. Ссылка это ещё одно название для переменной или alias
Вы случайно не знаете видео или статью где подробнее объясняют эту тему. А то как то хреново объяснил тему. "Просто запомните", даже не объяснил как толком это работает.
привет, вы год назад писали тут, это всё ещё актуально? или все же автор прав? Просто судя по выводу на экране ссылка все же хранила адрес переменной на которую ссылалась. ChatGPT подскзаал следующее: "Компилятор скрывает детали работы ссылки, но, по сути, ссылка внутри реализована как указатель на объект. Она оперирует адресом объекта, но сама по себе не дает прямого доступа к этому адресу."
@@ivan_naitoraito Привет, конечно актуально. В независимости от того как ссылка реализована компилятором, мы, как разработчики, должны использовать ссылку как эту переменную, это просто псевдоним, ещё одно название для переменной, и больше ничего
Если подумать. Разрядность процессора - 64, значит, в теории, размер оперативной памяти может быть очень большим (тип long, т.к. 8 * 8 = 64). Получается, чтобы хранить адрес ячейки памяти необходимо 8 байт. Верно? Теперь по поводу ссылок: гораздо нагляднее был бы пример с пользовательсим вводом внутри пользовательской функции, которая принимает параметр-ссылку и ни чего не возвращая, меняет значение по ссылке.
Я думал, что запись *(val + i ) , где val имеет тип int сместится на адрес слеующей ячейки памяти. А так как int это 4ре байта, то на вторую ячейку из четырёх. А для смещения на следующий элемент массива придётся делать *( val + i * sizeof( int ) ). Теперь сижу и думаю в чём я не прав.
Указатель типа int сам знает на сколько байт ему смещаться при арифметике указателей, компилятор распознает и интерпретирует например *(val + 2) как "добавить к адресу val 2*(sizeof(int)), и считать значение int по полученному адресу с помощью операции разыменования '*'
@@parabox3176я нашел ошибку (chatgpt точнее) ты скорее ошибся когда писал код в функции, по крайней мере я там ошибся. Я написал (*arr + i) а надо было *(arr + i), сорян если я не понятно объяснил
мне нравится как объясняет автор, лишь на объяснениях автора пока у меня выходит писать код, делаю задачи озвученную автором, код у меня иногда выходит не такой же как у автора, но работает, почувствовал что уже программист хах, сверил осмыслил переписал
Пожалуй, лучшее объяснение указателей и ссылок, которые вызывают у многих достаточно сложностей
Автор молодец, так качественно делает ролики. Жалко что так мало актива.
Хорошей аналогией адреса является номер почтового ящика... Это просто число. Но надо иметь ввиду что эти номера идут подряд от 0. Память в компе это нумерованные ячейки по 1 байту которые идут подряд. Если мы указываем адрес то мы говорим что в ячейке с таким номером лежат наши данные. Точнее данные лежат в ячейках памяти начиная с такого-то номера отсчитанные от 0. Потому что данные не всегда занимают 1 байт а обычно больше и потому занимают не 1 ячейку, а больше. Но эти ячейки всегда начинаются с адреса памяти этих данных. Ничего сложного в адресах нет. Это оч простая вещь если понять. Просто этих ячеек памяти в компе дофига и потому числа получаются оч большие...
уфффф.. наконец-таки я понял зачем в функциях получаемых из IDA куча лишних параметров вместе с указателями... наконец-таки понял что такое указатель и как с ним играть.. авесоме..
автор уже как родной
//дАДАДАДАДАДАДДА
while (true)
std::cout
@@ОльгаЮрова-е9к int main() {
while(true) {
std::cout
Вы не подключили
@@Tlay_Minecraft Я думаю, всем итак понятно
Программа уйдёт в бесконечный цикл и выдаст ошибку
Огромное спасибо! Твои видео очень помогают
Спасибо за урок, очень понятно объяснили!
20:50 можно просто написать условие if (arr[i] < min)
Нельзя, это указатель на элемент, а не сам массив
Это негласное правило по которому вы * пристыковываете с типом или с переменной определяет шарпист Вы или плюсовик. если вы пишете так int* a, то Вы шарпист, а если int *a, то плюсовик... А некоторые пишут так: int * a. Но это тоже плюсовик, но продвинутый. Такая запись подчёркивает тот факт что это именно указатель а не что-то ещё.
и выглядит это как умножение int на a.... По-моему бред)
Спасибо
Это было полезно!
Все понятно, кроме одного, где на практике нужно использовать ссылки? В каких случаях?
там, где не нужны указатели 😀
22:10 у меня код в точь точь как у тебя но минимальный елемент 5 хотя там тоже есть -2. Помоги
просто он гавнокодер и написал полную залупу, массив всегда передается как указатель , поэтому толку от int *arr нету, если говорить про ссылку на переменную, то это вообще пиздец, так никто не делает, из-за этого только путаница будет в коде
@@baldeg_ он с переменной сделал как пример для пояснения, на деле никто ж не будет на переменную указывать
можно вопрос? я в принципе понял, как работает последний пример. Но в функции в параметрах записано int * arr - получается тип данных - это указатель на int. А сам массив у нас не задан указателем, то есть выделением памяти - он задан просто, без указателя - int arr[]. Почему так? а не изначально int * arr = new int(len) и потом в функции полноправно использовать созданный указатель. Возможно я чего-то не знаю, или не понял. Но уже полгода программировал в универе и вроде бы так было правильно
Зачем нужны ссылки, если есть указатели?
minval(int arr[]) и (int *arr) одно и тоже. Массив всегда передается как указатель.
тоже на этом моменте не понял автора. в каком месте массив начинает занимать место дважды... по идее адрес у него один всегда.
а можно также с векторами делать надеюсь?
дякую
А как вывести двумерный массив с помощью указателей?и трёхмерный
А ты попробуй сам до этого дойти, ты программист)))0)
а зачем нужны вообще ссылки? ну типо у меня есть значение в одной переменной с названием X, и все что дают ссылки это менять значение X меняя Y.
Согласен, по сути только для того чтобы не занимать лишнюю память, но в тоже время если я допустим захочу изменять значение которое в себя принимает переменная, отдельно от ссылки. То изменяться будут оба значения и ссылки что в принципе логично и переменной. Тоже самое и с переменной. Сам особо не пойму где можно использовать. Другое дело указатели, реально полезная штука если разобраться.
@@ГусевАлександр-у1л один из вариантов применения - для создания псевдонима переменной. Например, вы дорабатываете чужой код, вам надо доработать код, функцию или метод, а предыдущий программист не сильно заморачивался с именами переменных и вместо rentpay (это просто пример, Оплата ренты) написал имя переменной одной буквой r, соответственно листать весь код и менять везде имя переменной вы не будете, вы просто создаете ссылку на переменную r и работаете с удобным и читаемым именем переменной.
Как можно пройти курс c++ у вас ?
на их сайте за дэнбги
Вот 5:11 у Вас же восьмибайтовый адрес переменной ))
8 байт это 8 бит 8 раз получается 64 символа . Там 64 символа?
Не понял зачем нужна переменная len ? Почему нельзя указать что i < 5 ? И почему показывает ошибку
Конкретно тут не нужна, но в целом полезная штука, как задел на будущее, особенно если нужно будет постоянно дёргать эту функцию и переменную в автоматическом режиме.
Не уверен как в C++ это сделать, но в C# можно было бы записать как int len = array.Length и получить обновляемую при каждом вызове функции переменную, которая переходила бы в void minimal автоматически. Как пример из практики - что-то подобное я делал из List'ов когда писал плагин для одной игры, который получал SteamID64 игроков и сортировал их по количеству убийств/смертей с записью в JSON файл.
В ссылке на переменную нет смысла если мы не используем полиморфизм. Потому что мы получаем фактически другое имя для неё. Это бесполезное действо. Более того вносит путаницу в код. Поэтому так никто не делает.
не понятно почему созданный массив передается в функцию и там занимает еще раз место. у него меняется адрес? он дублируется? что происходит при передаче массива в функцию, что он занимает еще раз место в памяти... этот момент не раскрыт. имхо.
что такое "len"?
подскажите пожалуйста в каком уроке его проходили?
(16:30)
len - это название, которое означает количество элементов в массиве. На его месте можно было бы написать любое другое название))
@@ДианаКривнюк-п9н благодарю
ааа понял!
во я туп туп)
всем привет ответьте на вопрос почему if (min>*(arr+i)); происходит смещение указателя а не сложение элемента массива с i
Потому что никакого элемента массива нет
Потому что arr это адрес первой ячейки массива элемент массива и меет длину 4 байт. Через 4 байт начинается второй элемент массива и переменная i это 4 байта тоесть каждый раз адрес увеличивается на 4 байта (для int, для других типов другая)
не понял, а почему у меня пишутся разные адреса одной и той же ячейки, то есть не как у вас
народ почемк я добавил отрицательные числа в массив, но метод минимум выводит лишь минимальное положительное число?
Возможно у тебя unsigned int, что значит беззнаковый int, но тогда бы ты не смог инициализировать переменную отрицательным значением, поэтому ответа на твой вопрос нету)) если ты сделал также как в видео разумеется
@@doctor_livsi_pod_phonk я уже нашел косяк) не помню где был. но спасибо
@@doctor_livsi_pod_phonkкстати нет если unsigned int передать минусовой Int то он выведет по модулю значения от максимального int вроде:
unsigned int num = -1;
std::cout
Не понял, почему ptrval вывел 20 после обнуления
Обнулился Только с *, а переменная осталась
Гоша, чтобы ты порекомендовал Линукс или виндовс для программирования если выбирать что то одно?
Для программирования FREEBSD там нечему ломаться и нагружать пк
Каждому удобнее разное, но в линуксе есть удобные пакетные менеджеры, возможность быть на musl, а не glibc, там хорошо работают тайлинговые wm, которые ускоряют разработку и повышают удоство.
Зачем вводить людей в заблуждение, ссылки ничего не хранят, а вот как раз указатели могут хранить адрес. Ссылка это ещё одно название для переменной или alias
если бы на ваш коммент, я бы так и не поняла ничего. Благодарюююю)))
Вы случайно не знаете видео или статью где подробнее объясняют эту тему. А то как то хреново объяснил тему. "Просто запомните", даже не объяснил как толком это работает.
привет, вы год назад писали тут, это всё ещё актуально? или все же автор прав? Просто судя по выводу на экране ссылка все же хранила адрес переменной на которую ссылалась. ChatGPT подскзаал следующее: "Компилятор скрывает детали работы ссылки, но, по сути, ссылка внутри реализована как указатель на объект. Она оперирует адресом объекта, но сама по себе не дает прямого доступа к этому адресу."
@@ivan_naitoraito Привет, конечно актуально. В независимости от того как ссылка реализована компилятором, мы, как разработчики, должны использовать ссылку как эту переменную, это просто псевдоним, ещё одно название для переменной, и больше ничего
А C++ плохо не станет если я напишу
int e = 1
int &a = e + 1
?
Я думаю нет . Выполнение начнётся с права налево : переменная e увеличится на единицу и адрес переменной e запишится в переменную a
Так и не понял в чем разница между ссылками и указателями
А нельзя было поставить ссылку на весь массив ?
Адрес перввог элемента и есть ссылка на весь массив
как добавились эти указатели все перепуталось, и простейшие программы теперь вообще не понятны(
можно ли делать игры с движком unity на c++?
Нет unity только с c#, c++ можно использовать в unreal engine
@@aram2010uk спасибо
Здравствуйте, скажите пожалуйста, почему Ваш сайт не открывается?
Я его взломал
Круто
Подскажи пожалуйста какой фреймворк выбрать для написания скринера на python для торговли на крипте?
С нуля писать можно.
Если подумать. Разрядность процессора - 64, значит, в теории, размер оперативной памяти может быть очень большим (тип long, т.к. 8 * 8 = 64).
Получается, чтобы хранить адрес ячейки памяти необходимо 8 байт. Верно?
Теперь по поводу ссылок: гораздо нагляднее был бы пример с пользовательсим вводом внутри пользовательской функции, которая принимает параметр-ссылку и ни чего не возвращая, меняет значение по ссылке.
все понял лишний амперсант написал
Я думал, что запись *(val + i ) , где val имеет тип int сместится на адрес слеующей ячейки памяти. А так как int это 4ре байта, то на вторую ячейку из четырёх.
А для смещения на следующий элемент массива придётся делать
*( val + i * sizeof( int ) ).
Теперь сижу и думаю в чём я не прав.
Указатель типа int сам знает на сколько байт ему смещаться при арифметике указателей, компилятор распознает и интерпретирует например *(val + 2) как "добавить к адресу val 2*(sizeof(int)), и считать значение int по полученному адресу с помощью операции разыменования '*'
@@raldbthar логика понятна, спасибо. 🤝🏼
Про указатели и ссылки вообще не понятное объяснение.
Полностью скопировал код из видео, код не работает. Ни черта не понимаю. Программирование это весело.
chatGPT в помощь
У меня тоже. Исправил ошибку? Если да, помоги пожалуйста.
@@w0njet Неа. Я забил на неё.
@@parabox3176я нашел ошибку (chatgpt точнее) ты скорее ошибся когда писал код в функции, по крайней мере я там ошибся. Я написал (*arr + i) а надо было *(arr + i), сорян если я не понятно объяснил
Нихуя не понятно
согласен
22:10 у меня код в точь точь как у тебя но минимальный елемент 5 хотя там тоже есть -2. Помоги
Я нашел ошибку 😂
у меня такое же, в чём была ошибка?@@w0njet
Всё, нашёл в чём проблема) Я вместо i , написал 1
А я не нашëл
@@Arh-s2q нашел ошибку?