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