За разницу между инициализацией и присваиванием - огромное спасибо!
@sladge17 Жыл бұрын
Не так страшны указатели, как указатели на указатели.
@tanyarudykh6898Ай бұрын
Ну, указатель на массив же
@vimbor5034 Жыл бұрын
Очередной шедевр от Сергея, да еще с юмором и мягким укором в адрес непонимающих эти самые указатели)) Сергей, вы правы, у меня, да и думаю не только у меня, использование указателей вызывает трудности из-за недопонимания сути...Спасибо за подробнейшие разъяснения !!!
@ИгорьРубацкий-ч1оАй бұрын
Спасибо за чёткое объяснение. Я многих программистов посмотрел, но как Вы объяснили , никто так не смог. Мне стало всё понятно со второго просмотра)). Спасибо ещё раз. Всех благ .
@МарусяКарташова-з3э7 ай бұрын
Спасибо вам за понятную, простую, интересную подачу материала! Как жаль, что у меня не было в институте такого преподавателя по Си
@Numagic7 ай бұрын
Это прекрасно даже в 2024 xD спасибо🙏
@ilyuhagg8546 Жыл бұрын
Это лучший видео урок по указателям, глупцы
@РоманМартынов-з4х Жыл бұрын
Лучшее объяснение указателей!
@andrewbelikov8772 Жыл бұрын
В школе изучал С, это была самая сложная тема и вообще не понял нафига это надо. На этом мое обучение собственно и закончилось. Умеешь разложить на понятные полочки!
@ДмитрийСергеев-л6г Жыл бұрын
Сергей, спасибо за С!!! Лучшее объяснение
@blackbirdchannel-c7b Жыл бұрын
Очень качественно и доходчиво!
@dnevnic-lihacha Жыл бұрын
Храни тебя Бог добрый человек
@MegaGalver Жыл бұрын
Очень доходчиво, спасибо!
@weerbox Жыл бұрын
Чтобы по началу меньше путаться, можно использовать запись объявления указателя так, что символ указателя ✱ относится к типу, а не к имени (хотя это и не так, т.к это оператор), например int✱ pointer; теперь читаем справа налево: pointer это указатель на int. Это воспринимается логичнее, чем int ✱pointer; которое интуитивно читается как ✱pointer это переменная типа int. И при инициализации это тоже выглядит более логичным, int✱ pointer = 0; т.е, мы именно указателю pointer присваеваем значение 0, а не области памяти на которую он ссылается, как это интуитивно читается в int ✱pointer = 0; Это так же логичнее выглядит в аргументах функции. Но стоит иметь ввиду, что это условность, которая может и навредить, например в объявлении int✱ i, n; мы не объявляем два указателя на int, как это теперь выглядит, а объявляем указатель на int под именем i, и переменную под именем n типа int, т.е. int ✱i, n; (пришлось стандартный символ звездочек заменить на другие т.к. ютуб эти звездочки рядом с текстом интерпритирует как жирный текст и съедает)
@olegkomlev Жыл бұрын
Да, это очень важно замечание, спасибо. Видимо, при выборе такого синтаксиса объявлений указателей подразумевалось, что ✱ - операция разыменования ,т.е. звездочка относится к идентификатору переменной, а не к типу (стоит перед именем переменной, а не после имени типа). Поэтому int ✱i, n; означает "после разыменования i получится l-value типа int, а n - это сразу переменная типа int". Такое смысловое объединение звездочки и переменной важно, потому что в С указатели применяются для выходных параметров функции. В Паскале можно написать перед формальным параметром var x:integer (а в С++ написать int &x ) и потом в теле функции и при вызове можно использовать только саму переменную. Но в Си в качестве фактического аргумента в таких случаях нужно писать &x (мы уже видели это на примере scanf), а в функции везде выполнять разыменование, т.е. вместо переменной х писать ✱х, считая ✱х единым целым (единым выходным параметром). Забыть звездочку для выходной переменной в теле функции или & при вызове такой функции - частая ошибка новичков.
@neonator79 Жыл бұрын
Супер объяснение! Я даже понял)
@denkovalenkotag1Ай бұрын
Как же все понятно. Спасибо! Где вы были 25 лет назад? :)
@AndrewOBannon Жыл бұрын
Сергей, спасибо тебе.
@andredru4278 Жыл бұрын
Спасибо. Вот это да!
@andrey_sautenko Жыл бұрын
спасибо за урок!
@smyak34103 ай бұрын
А откуда gpd появился то?
@YuriRogovАй бұрын
Каждый раз когда я натыкаюсь на видео этого автора, каждый раз я ухожу с еще большим непониманием. Слишком подробно, чрезмерно усложненно, недоступно для масс.
@alexeybakushev1932Ай бұрын
Спасибо! Очень понятные уроки. Сегодня впервые столкнулся со странным поведением, что не могу пока понять. А мои указатели каждый раз демонстрируют разные ячейки. Например: ptr = 000000F6A00FF6F4, *ptr = 1, d = 1 ptr = 000000F6A00FF6F4, *ptr = 2, d = 2 Второе выполнение: ptr = 0000006B7E7DF514, *ptr = 1, d = 1 ptr = 0000006B7E7DF514, *ptr = 2, d = 2 и т.д. Это может быть связано с железом и устройством памяти? И самое интересное, что результат из урока "адресная арифметика" именно ожидаемый выходит. Значение на 1 увеличивается. int g = 4; int ptr = &g; printf("ptr = %u ", ptr); ptr++; printf("ptr = %u ", ptr); Вывод: ptr = 353367524 ptr = 353367525
@donfedor007 Жыл бұрын
Спасибо Вам огромное!!!
@jamjam3337 Жыл бұрын
спасибо!👏👍
@alekskapitonov2738 Жыл бұрын
Спасибо!
@du90753 ай бұрын
Спасибо!
@Lebl9dina2 ай бұрын
Лучший мужчина
@ФёдорПастухов-в4ъ Жыл бұрын
Теперь все будут задавать вопрос откуда взялся gpd?
@zahar1381 Жыл бұрын
я понял! спасибо! осталось понять нафик они нужны, если есть обычные переменные
@sladge17 Жыл бұрын
Например при динамическом выделении памяти.
@CetoPizdec9 ай бұрын
Недосмотрел пока, но как понял. То есть адресом ячейки будет первая ячейка в памяти а остальные в её области будут кагбы частью её? То есть количество этой области ячеек является количество байт выделяемых под неё? Но при это адресом ячейки будет лишь первая ячейка, но последующая область с ней типа повязана)
@АртемФедулов-у3э Жыл бұрын
А запись integer в ячейки памяти слева-направо (слева младшие разряды, справа старшие разряды) - это условность? Т.е. наверно на разных архитектурах и разных ОС может быть в реальности по-разному? Бывает ли на практике, что C программисты как-то полагаются на определенный порядок?
@selfedu_rus Жыл бұрын
да, на разных устройствах по разному может быть
@BobTursunov3 ай бұрын
Спасибо вам большое! Очень понятно и доходчиво) Интересно, почему в CS50 так подробно не объясняют? Студенты Гарварда особенные что ли?)))
@DeadnWoon5 ай бұрын
Можно ли обойтись без указателей, как явления - вот в чём вопрос?.. Нет, с адресами в памяти работать придётся - но нужны ли для этого специальные сущности или это просто синтаксический сахар? Если мы знаем размер адреса (который, видимо, традиционно равен размеру машинного слова), то просто берём целое (знаковое или беззнаковое, как нам удобнее) и храним в нём адрес. Отмечаем в блокнотике или где ещё размер того, адреса чего мы собираемся хранить - и всё! Если в языке существует некий оператор или функция, позволяющий найти ближайшее подходящее место в куче, ищем то место. Если в языке есть оператор или функция, позволяющие разместить переменную по конкретному адресу, используем его! В итоге исчезает вся проблема контекстной зависимости всей этой символики с её звёздочками и амперсандами. Просто работаем с адресами, как с целыми беззнаковыми числами.
@selfedu_rus5 ай бұрын
язык Java, Python, например, там неявные указатели и сборщики мусора
@DeadnWoon4 ай бұрын
@@selfedu_rus Но, насколько я понимаю, там есть ссылки...
@zzzackxv11 күн бұрын
@@DeadnWoon вроде как эти ссылки и являются неявными указателями
@Franc_Net Жыл бұрын
Прям как в Delphi ;) У Си * а у меня ^. Но смысл один :)
@РусланКарнеенко11 ай бұрын
Супер
@astarkmn Жыл бұрын
Интересно. В следующем уроки будут рассматриваться: указатели на массив, структуры; передача указателей в функцию; Константные указатели и указатели на константные значения?
@selfedu_rus Жыл бұрын
да, все это будет + указатели на функции
@anvarx1 Жыл бұрын
Самое лучшее изложение понятия об указателях на русском языке. Спасибо за уроки.
@siyovushfurkati1642Ай бұрын
Спасибо конечно. Я понял как это все работает но я не понял для чего она нужна?
@ГомункулСтарший Жыл бұрын
получается любая целочисленная переменная одновременно является и указателем на какую то другую переменную?
@AntaresI102410 ай бұрын
Подскажите, все таки какой смысл в указателях, если есть обычные переменные? Вы так и не рассказали)) Только ли передавать массив в функцию? Но ведь можно объявлять глобально массив и из функции к нему обращаться. Была инфа, что глобальные переменные и массивы это дурной тон в Си, так ли это?
@selfedu_rus10 ай бұрын
См. раздел по функциям - ответ там.
@TestTest-fi2ok6 ай бұрын
Хорошее видео
@АндрейИванов-е6о4т Жыл бұрын
int a = 10; int* gpt; gpt = &a; //адрес переменной "а" присвоили указатель a++; *gpt = a; //переменную "a" увеличенную на единицу перезаписываем по адресу указателя Еще заняли место под указатели в памяти, помню что указатели как-то работают с функцией, но если под указатели все равно выделяется память, зачем это все, можно работать тогда с глобальной переменной.
@selfedu_rus Жыл бұрын
Зачем нужны будет дальше. А использование глобальных переменных крайне плохая практика для Си.
@zzzackxv11 күн бұрын
Вопрос от новичка, разве &x условно, не является указателем? Мы же вроде не получаем конкретно адрес, а лишь указатель на этот адрес, поэтому тип данных будет int* (если x - int) Заранее извиняюсь, если горожу глупость
@selfedu_rus11 күн бұрын
&x возвращает указатель на переменную; если x - это int, то да, возвращается int *
@zzzackxv11 күн бұрын
@ спасибо вам !
@АлексейАлексеев-ц8х9т Жыл бұрын
Если указатель - это переменная, которая хранит в себе адрес байта, то что хранит в себе простая переменная? Ведь помимо значения она тоже должна знать адрес, где это значение прочитать. Количество байт, выделяемую под переменную хватает только лишь для её значения, тогда где она хранит информацию об адресе?
@selfedu_rus Жыл бұрын
На уровне машинных кодов вместо имени переменной используется адресация к памяти, где хранится значение переменной. Все остальное также.
@rokor9 күн бұрын
Я вот так и не понял чем указатель такой крутой , если выполняет всё тоже самое что и переменная , тогда зачем указатель?
@selfedu_rus9 күн бұрын
см. дальше (до конца весь плейлист) и вопрос уйдет
@ГубкаБоб-р8ъ Жыл бұрын
Спасибо за знания. Имя указателя можно использовать любое? Не обязательно *gpt?
@selfedu_rus Жыл бұрын
да, любое, также как и имя переменной
@ШамильРамазанов-с9ю Жыл бұрын
топчик
@АнатолийАндреич-к7ш10 ай бұрын
Ребят, не подскажите какую программу автор использует для написания кода?
@selfedu_rus10 ай бұрын
В самом начале отмечается: VS Code
@АнатолийАндреич-к7ш10 ай бұрын
@@selfedu_rus понял,спасибо!
@kyami8718 Жыл бұрын
А если я возьму не один тип (допустим int),а два разных.Можно ли использовать приведение типов?
@selfedu_rus Жыл бұрын
для этого приведение и реализовано в Си
@nickolayivanov67010 ай бұрын
8:59 - Я так и не понял где ответ на главный вопрос. Зачем создавать ещё одну переменную с адресом другой переменной, а не обращаться к ней непосредственно по имени. Извините, я тупенький. Мне непонятно.
@selfedu_rus10 ай бұрын
об этом в функциях, когда речь пойдет об указателях в их параметрах
@nickolayivanov67010 ай бұрын
@@selfedu_rus Спасибо. Будем смотреть)
@BobTursunov3 ай бұрын
Например, чаще всего, работая над одной функцией, приходится менять значение переменной в другой функции. Тогда указатели - ваш самый близкий друг))) И это всего лишь один маленький пример)
@yazmeyaa6 ай бұрын
Я не могу понять почему в 4-байтном представлении число 75432 имеет в слогаемых именно числа 168, 38, 1 и 0. Объясните как они образовались, пожалуйста :(
@yazmeyaa6 ай бұрын
Вопрос отпал, посчитал всё вручную и всё встало на свои места. :)
@fidjiworld29285 ай бұрын
А я все равно не понимаю
@baxram97 Жыл бұрын
Можете сделать видео про то, как сделать свой string на Си?
@selfedu_rus Жыл бұрын
Про строки дальше. Как свой string - это уже С++ и классы.
@baxram97 Жыл бұрын
@@selfedu_rus можно ведь и на Си, используя malloc и struct
@selfedu_rus Жыл бұрын
@@baxram97 такой красоты, как с ООП не получится, т.к. в чистом Си struct не может перегружать операторы
@VladGavrilov Жыл бұрын
char *gpt - это отсылка на ChatGPT?🤔
@alexbobtail4862 Жыл бұрын
Это про С или про С++? Язык С без плюсов еще применяется?
@selfedu_rus Жыл бұрын
Это Си, и это первый шаг в изучении С++, т.к. он развитие языка Си.
@vovkodinak2416 Жыл бұрын
C без плюсов применяется и будет применятся. Он используется для написания прошивок для микроконтролеров. Для обычных компов на С пишут драйвера для работы с устройствами.
@michaelplatonov Жыл бұрын
всё ядро линукса написано на си, без плюсов, и плюсов там никогда не будет:)
@lemmenmin7676 Жыл бұрын
@@michaelplatonov не верю, там уже Rust "разрешили"
@michaelplatonov Жыл бұрын
@@lemmenmin7676 ну так rust это не плюсы, и это уже не gnu и так далее)
@alexnavin8833 Жыл бұрын
Чем отличается d = 10; от *&d = 10; ?
@selfedu_rus Жыл бұрын
ничем (на уровне машинных кодов), по крайне мере, в смысловом значении
@ВадимСагайдак-ь5н10 ай бұрын
Моя удача что я не начал изучать в Си в таком изложении,ничего бы не понял,много воды.Я изучал указатели в другом,понятном изложении,вот там все было понятно.Ничего личного.
@IrinaBod9 ай бұрын
а где вы учили указатели?
@MrALEXUS100 Жыл бұрын
Мне кажется, что до этого видео я понимал лучше, что такое указатели. С этими ячейками памяти муть какая-то, зачем это число(адрес) раскладывать так и не понял
@selfedu_rus Жыл бұрын
А как вы целые числа больше 255 будете хранить?
@MrALEXUS100 Жыл бұрын
@@selfedu_rus то, что число имеют свое представление в двоичной системе я понимаю, но относится ли это к вопросу указателей, по моему это не нужные подробности, которые только отвлекают от главного. эти разложения можно можно сделать как дополнение к теме указателей. я сам только учусь, не воспринимайте пожалуйста мои слова как критику, а как вопрос в голове студента-самоучки
@michaelplatonov Жыл бұрын
а ещё указатель может быть на функцию:)
@grayich Жыл бұрын
@@selfedu_rus Тоже думал, что числа хранятся в развёрнутой на несколько байт двоичной форме. А оказалось раскладывается побайтово-разрядно.. кстати. есть у этого метода название?
@MrALEXUS100 Жыл бұрын
@@michaelplatonov вот было бы круто, если бы на двух половинах экрана сравнили, как все работает через обычню переменную, и как через указатаель. как по мне так есть просто три сущности, значение, адрес и имя переменной, и все взаимодействие со значением происходит по двум сценариям - через переменную(которая все равно ссылается на указатель) или через указатель напрямую
@-ij8ym7 ай бұрын
Gpt gpd. Кто так объясняет? Не надо хайповать. А называть как принято pointer, ptr. Палец вниз.
@mifas50225 ай бұрын
Человек объясняет доступно и понятно, причем бесплатно, причем тут название переменных