#26. Указатели. Проще простого | Язык C для начинающих

Sdílet
Vložit
  • čas přidán 6. 09. 2024
  • Практический курс по C/C++: stepik.org/cou...
    Телеграм-канал: t.me/java_and_c
    Инфо-сайт: proproprogs.ru...
    Что такое указатели, зачем они нужны. Объявление указателей. Получение адреса переменных. Изменение переменных через указатели.

Komentáře • 103

  • @sladge17
    @sladge17 Před rokem +69

    Не так страшны указатели, как указатели на указатели.

  • @Numagic
    @Numagic Před 3 měsíci +8

    Это прекрасно даже в 2024 xD спасибо🙏

  • @alexdubkov6998
    @alexdubkov6998 Před rokem +14

    За разницу между инициализацией и присваиванием - огромное спасибо!

  • @user-sm8qs2lh8o
    @user-sm8qs2lh8o Před 3 měsíci +3

    Спасибо вам за понятную, простую, интересную подачу материала! Как жаль, что у меня не было в институте такого преподавателя по Си

  • @vimbor5034
    @vimbor5034 Před rokem +7

    Очередной шедевр от Сергея, да еще с юмором и мягким укором в адрес непонимающих эти самые указатели)) Сергей, вы правы, у меня, да и думаю не только у меня, использование указателей вызывает трудности из-за недопонимания сути...Спасибо за подробнейшие разъяснения !!!

  • @andrewbelikov8772
    @andrewbelikov8772 Před rokem +6

    В школе изучал С, это была самая сложная тема и вообще не понял нафига это надо. На этом мое обучение собственно и закончилось. Умеешь разложить на понятные полочки!

  • @ilyuhagg8546
    @ilyuhagg8546 Před rokem +5

    Это лучший видео урок по указателям, глупцы

  • @dnevnic-lihacha
    @dnevnic-lihacha Před 11 měsíci +3

    Храни тебя Бог добрый человек

  • @blackbirdchannel-c7b
    @blackbirdchannel-c7b Před 10 měsíci +4

    Очень качественно и доходчиво!

  • @user-uu9xi3rv8o
    @user-uu9xi3rv8o Před 10 měsíci +2

    Лучшее объяснение указателей!

  • @user-qp8hg4ds2b
    @user-qp8hg4ds2b Před rokem +2

    Сергей, спасибо за С!!!
    Лучшее объяснение

  • @neonator79
    @neonator79 Před rokem +2

    Супер объяснение! Я даже понял)

  • @MegaGalver
    @MegaGalver Před rokem +3

    Очень доходчиво, спасибо!

  • @weerbox
    @weerbox Před rokem +12

    Чтобы по началу меньше путаться, можно использовать запись объявления указателя так, что символ указателя ✱ относится к типу, а не к имени (хотя это и не так, т.к это оператор), например
    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
      @olegkomlev Před 11 měsíci +4

      Да, это очень важно замечание, спасибо. Видимо, при выборе такого синтаксиса объявлений указателей подразумевалось, что ✱ - операция разыменования ,т.е. звездочка относится к идентификатору переменной, а не к типу (стоит перед именем переменной, а не после имени типа). Поэтому int ✱i, n; означает "после разыменования i получится l-value типа int, а n - это сразу переменная типа int". Такое смысловое объединение звездочки и переменной важно, потому что в С указатели применяются для выходных параметров функции. В Паскале можно написать перед формальным параметром var x:integer (а в С++ написать int &x ) и потом в теле функции и при вызове можно использовать только саму переменную. Но в Си в качестве фактического аргумента в таких случаях нужно писать &x (мы уже видели это на примере scanf), а в функции везде выполнять разыменование, т.е. вместо переменной х писать ✱х, считая ✱х единым целым (единым выходным параметром). Забыть звездочку для выходной переменной в теле функции или & при вызове такой функции - частая ошибка новичков.

  • @andrey_sautenko
    @andrey_sautenko Před rokem +3

    спасибо за урок!

  • @AndrewOBannon
    @AndrewOBannon Před rokem +1

    Сергей, спасибо тебе.

  • @andredru4278
    @andredru4278 Před 8 měsíci +2

    Спасибо. Вот это да!

  • @donfedor007
    @donfedor007 Před rokem +2

    Спасибо Вам огромное!!!

  • @DeadnWoon
    @DeadnWoon Před měsícem +1

    Можно ли обойтись без указателей, как явления - вот в чём вопрос?.. Нет, с адресами в памяти работать придётся - но нужны ли для этого специальные сущности или это просто синтаксический сахар? Если мы знаем размер адреса (который, видимо, традиционно равен размеру машинного слова), то просто берём целое (знаковое или беззнаковое, как нам удобнее) и храним в нём адрес. Отмечаем в блокнотике или где ещё размер того, адреса чего мы собираемся хранить - и всё! Если в языке существует некий оператор или функция, позволяющий найти ближайшее подходящее место в куче, ищем то место. Если в языке есть оператор или функция, позволяющие разместить переменную по конкретному адресу, используем его! В итоге исчезает вся проблема контекстной зависимости всей этой символики с её звёздочками и амперсандами. Просто работаем с адресами, как с целыми беззнаковыми числами.

    • @selfedu_rus
      @selfedu_rus  Před měsícem

      язык Java, Python, например, там неявные указатели и сборщики мусора

    • @DeadnWoon
      @DeadnWoon Před 9 dny

      @@selfedu_rus Но, насколько я понимаю, там есть ссылки...

  • @anvarx1
    @anvarx1 Před rokem +3

    Самое лучшее изложение понятия об указателях на русском языке. Спасибо за уроки.

  • @Franc_Net
    @Franc_Net Před 10 měsíci +2

    Прям как в Delphi ;)
    У Си * а у меня ^. Но смысл один :)

  • @zahar1381
    @zahar1381 Před rokem

    я понял! спасибо! осталось понять нафик они нужны, если есть обычные переменные

    • @sladge17
      @sladge17 Před rokem +1

      Например при динамическом выделении памяти.

  • @user-xm5zl9up4r
    @user-xm5zl9up4r Před 7 měsíci +2

    Супер

  • @jamjam3337
    @jamjam3337 Před rokem +2

    спасибо!👏👍

  • @alekskapitonov2738
    @alekskapitonov2738 Před rokem +2

    Спасибо!

  • @TestTest-fi2ok
    @TestTest-fi2ok Před 2 měsíci +1

    Хорошее видео

  • @CetoPizdec
    @CetoPizdec Před 5 měsíci +1

    Недосмотрел пока, но как понял.
    То есть адресом ячейки будет первая ячейка в памяти а остальные в её области будут кагбы частью её? То есть количество этой области ячеек является количество байт выделяемых под неё? Но при это адресом ячейки будет лишь первая ячейка, но последующая область с ней типа повязана)

  • @user-ud2gd7bl1z
    @user-ud2gd7bl1z Před rokem +3

    А запись integer в ячейки памяти слева-направо (слева младшие разряды, справа старшие разряды) - это условность? Т.е. наверно на разных архитектурах и разных ОС может быть в реальности по-разному? Бывает ли на практике, что C программисты как-то полагаются на определенный порядок?

    • @selfedu_rus
      @selfedu_rus  Před rokem

      да, на разных устройствах по разному может быть

  • @user-bh1dt3xl7c
    @user-bh1dt3xl7c Před rokem +5

    Теперь все будут задавать вопрос откуда взялся gpd?

  • @AntaresI1024
    @AntaresI1024 Před 6 měsíci +1

    Подскажите, все таки какой смысл в указателях, если есть обычные переменные? Вы так и не рассказали)) Только ли передавать массив в функцию? Но ведь можно объявлять глобально массив и из функции к нему обращаться. Была инфа, что глобальные переменные и массивы это дурной тон в Си, так ли это?

    • @selfedu_rus
      @selfedu_rus  Před 6 měsíci

      См. раздел по функциям - ответ там.

  • @user-zw3dt4qx3i
    @user-zw3dt4qx3i Před rokem

    int a = 10;
    int* gpt;
    gpt = &a; //адрес переменной "а" присвоили указатель
    a++;
    *gpt = a; //переменную "a" увеличенную на единицу перезаписываем по адресу указателя
    Еще заняли место под указатели в памяти, помню что указатели как-то работают с функцией, но если под указатели все равно выделяется память, зачем это все, можно работать тогда с глобальной переменной.

    • @selfedu_rus
      @selfedu_rus  Před rokem +2

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

  • @yazmeyaa
    @yazmeyaa Před 2 měsíci +1

    Я не могу понять почему в 4-байтном представлении число 75432 имеет в слогаемых именно числа 168, 38, 1 и 0.
    Объясните как они образовались, пожалуйста :(

    • @yazmeyaa
      @yazmeyaa Před 2 měsíci +1

      Вопрос отпал, посчитал всё вручную и всё встало на свои места. :)

    • @fidjiworld2928
      @fidjiworld2928 Před měsícem

      А я все равно не понимаю

  • @user-un9kd7my5c
    @user-un9kd7my5c Před rokem +1

    получается любая целочисленная переменная одновременно является и указателем на какую то другую переменную?

  • @astarkmn
    @astarkmn Před rokem +2

    Интересно. В следующем уроки будут рассматриваться:
    указатели на массив, структуры;
    передача указателей в функцию;
    Константные указатели и указатели на константные значения?

    • @selfedu_rus
      @selfedu_rus  Před rokem +3

      да, все это будет + указатели на функции

  • @user-cm1ri1sn2u
    @user-cm1ri1sn2u Před 11 měsíci +1

    Если указатель - это переменная, которая хранит в себе адрес байта, то что хранит в себе простая переменная? Ведь помимо значения она тоже должна знать адрес, где это значение прочитать. Количество байт, выделяемую под переменную хватает только лишь для её значения, тогда где она хранит информацию об адресе?

    • @selfedu_rus
      @selfedu_rus  Před 11 měsíci +1

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

  • @user-un7uz9id6w
    @user-un7uz9id6w Před 4 měsíci +1

    Здравствуйте, можете подсказать пожалуйста, почему когда у нас тип int, то так странно расписывается на 4 байта число, в один байт нельзя вписать число 75432? И ещё, указатель указывает только на адрес первого байта переменной типа int, почему тогда сам он занимает 8 байт?

    • @selfedu_rus
      @selfedu_rus  Před 4 měsíci +1

      База! Напишите это в ТГ-канал по Си, вам сообщество с удовольствием во всех деталях распишет.

  • @user-xr1sr4pz4z
    @user-xr1sr4pz4z Před rokem +1

    топчик

  • @user-it3yo1sn6i
    @user-it3yo1sn6i Před rokem

    Спасибо за знания. Имя указателя можно использовать любое? Не обязательно *gpt?

    • @selfedu_rus
      @selfedu_rus  Před rokem +2

      да, любое, также как и имя переменной

  • @kyami8718
    @kyami8718 Před rokem +1

    А если я возьму не один тип (допустим int),а два разных.Можно ли использовать приведение типов?

    • @selfedu_rus
      @selfedu_rus  Před rokem +1

      для этого приведение и реализовано в Си

  • @user-lp6if6zr4o
    @user-lp6if6zr4o Před 6 měsíci +1

    Ребят, не подскажите какую программу автор использует для написания кода?

    • @selfedu_rus
      @selfedu_rus  Před 6 měsíci

      В самом начале отмечается: VS Code

    • @user-lp6if6zr4o
      @user-lp6if6zr4o Před 6 měsíci

      @@selfedu_rus понял,спасибо!

  • @baxram97
    @baxram97 Před rokem

    Можете сделать видео про то, как сделать свой string на Си?

    • @selfedu_rus
      @selfedu_rus  Před rokem

      Про строки дальше. Как свой string - это уже С++ и классы.

    • @baxram97
      @baxram97 Před rokem

      @@selfedu_rus можно ведь и на Си, используя malloc и struct

    • @selfedu_rus
      @selfedu_rus  Před rokem +1

      @@baxram97 такой красоты, как с ООП не получится, т.к. в чистом Си struct не может перегружать операторы

  • @nickolayivanov670
    @nickolayivanov670 Před 6 měsíci +1

    8:59 - Я так и не понял где ответ на главный вопрос. Зачем создавать ещё одну переменную с адресом другой переменной, а не обращаться к ней непосредственно по имени. Извините, я тупенький. Мне непонятно.

    • @selfedu_rus
      @selfedu_rus  Před 6 měsíci

      об этом в функциях, когда речь пойдет об указателях в их параметрах

    • @nickolayivanov670
      @nickolayivanov670 Před 6 měsíci

      @@selfedu_rus Спасибо. Будем смотреть)

  • @alexnavin8833
    @alexnavin8833 Před rokem +1

    Чем отличается d = 10; от *&d = 10; ?

    • @selfedu_rus
      @selfedu_rus  Před rokem +1

      ничем (на уровне машинных кодов), по крайне мере, в смысловом значении

  • @VladGavrilov
    @VladGavrilov Před 10 měsíci

    char *gpt - это отсылка на ChatGPT?🤔

  • @alexbobtail4862
    @alexbobtail4862 Před rokem

    Это про С или про С++? Язык С без плюсов еще применяется?

    • @selfedu_rus
      @selfedu_rus  Před rokem +2

      Это Си, и это первый шаг в изучении С++, т.к. он развитие языка Си.

    • @vovkodinak2416
      @vovkodinak2416 Před rokem +4

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

    • @michaelplatonov
      @michaelplatonov Před rokem +5

      всё ядро линукса написано на си, без плюсов, и плюсов там никогда не будет:)

    • @lemmenmin7676
      @lemmenmin7676 Před rokem

      @@michaelplatonov не верю, там уже Rust "разрешили"

    • @michaelplatonov
      @michaelplatonov Před rokem

      @@lemmenmin7676 ну так rust это не плюсы, и это уже не gnu и так далее)

  • @MrALEXUS100
    @MrALEXUS100 Před rokem +4

    Мне кажется, что до этого видео я понимал лучше, что такое указатели. С этими ячейками памяти муть какая-то, зачем это число(адрес) раскладывать так и не понял

    • @selfedu_rus
      @selfedu_rus  Před rokem

      А как вы целые числа больше 255 будете хранить?

    • @MrALEXUS100
      @MrALEXUS100 Před rokem +3

      @@selfedu_rus то, что число имеют свое представление в двоичной системе я понимаю, но относится ли это к вопросу указателей, по моему это не нужные подробности, которые только отвлекают от главного. эти разложения можно можно сделать как дополнение к теме указателей. я сам только учусь, не воспринимайте пожалуйста мои слова как критику, а как вопрос в голове студента-самоучки

    • @michaelplatonov
      @michaelplatonov Před rokem

      а ещё указатель может быть на функцию:)

    • @grayich
      @grayich Před rokem +1

      @@selfedu_rus Тоже думал, что числа хранятся в развёрнутой на несколько байт двоичной форме. А оказалось раскладывается побайтово-разрядно.. кстати. есть у этого метода название?

    • @MrALEXUS100
      @MrALEXUS100 Před rokem

      @@michaelplatonov вот было бы круто, если бы на двух половинах экрана сравнили, как все работает через обычню переменную, и как через указатаель. как по мне так есть просто три сущности, значение, адрес и имя переменной, и все взаимодействие со значением происходит по двум сценариям - через переменную(которая все равно ссылается на указатель) или через указатель напрямую

  • @user-se2ms5rd8o
    @user-se2ms5rd8o Před 6 měsíci

    Моя удача что я не начал изучать в
    Си в таком изложении,ничего бы не понял,много воды.Я изучал указатели в другом,понятном изложении,вот там все было понятно.Ничего личного.

    • @IrinaBod
      @IrinaBod Před 5 měsíci

      а где вы учили указатели?

  • @-ij8ym
    @-ij8ym Před 3 měsíci +1

    Gpt gpd. Кто так объясняет? Не надо хайповать. А называть как принято pointer, ptr. Палец вниз.

    • @mifas5022
      @mifas5022 Před měsícem

      Человек объясняет доступно и понятно, причем бесплатно, причем тут название переменных

  • @stanislavpodlisker2319
    @stanislavpodlisker2319 Před měsícem +1

    Просто о сложном