Язык Си с нуля - Урок 26 - Указатель на указатель

Поділитися
Вставка
  • Опубліковано 16 жов 2024
  • Это видео для тех, кто еще ни разу не программировал, но прошел предыдущие 25 уроков.
    В данном уроке мы изучим:
    указатели на указатели
    как их использовать
    ► Плей лист - • Программирование на Си...
    Уроки по теме:
    ► урок 2 - Вывод на экран - • Программирование на Си...
    ► урок 3 - Условный оператор и операторные скобки - • Программирование на Си...
    ► урок 16 - Приведение типов - • Язык Си с нуля - Урок ...
    ► урок 21 - Указатели - • Язык Си с нуля - Урок ...
    ► урок 22 - Передача параметров по указателю - • Язык Си с нуля - Урок ...
    ► урок 24 - Виды указателей - • Язык Си с нуля - Урок ...
    Язык Си с нуля - данный видеокурс предназначен для тех, кто еще ни разу не программировал. Здесь я максимально понятно пошагово объясняю основы программирования на языке Си. Если хотите научиться программировать на языке Си - пройдите весь курс. Помимо объяснения материала я даю домашку. А после каждых нескольких уроков мы вместе пишем забавные игры!)

КОМЕНТАРІ • 32

  • @jamesdavis4071
    @jamesdavis4071 3 роки тому +5

    Спасибо тебе добрый человек! Доходчиво и лаконично объясняешь, то что надо!

  • @nb-cy6cw
    @nb-cy6cw 4 роки тому +41

    Вау. Почему у инфо цыган типо Гоши или Хауди вся аудитория ( вот где лежит годнота, давно искал

    • @ahahahahahahahahahaahahaha5306
      @ahahahahahahahahahaahahaha5306 3 роки тому

      @MrDixioner спс за инфу, пойду отпишусь от Хауди и сюда присоединюсь

    • @MrEksol
      @MrEksol 2 місяці тому

      Кто ещё за завяли и Гоша?

  • @k777ig
    @k777ig 4 роки тому +7

    Огромное спасибо за урок)

  • @andreysemischastnov5284
    @andreysemischastnov5284 2 роки тому +3

    Где же ты раньше был))) Спасибо большое тебе за уроки)

  • @ДмитрийКошелев-п5э
    @ДмитрийКошелев-п5э 4 роки тому +5

    Съел за тебя шоколад! Надеюсь поддержал.

  • @travellingYellow
    @travellingYellow Рік тому

    ОГРОМНОЕ СПАСИБО ЗА УРОКИ!

  • @АндрейБабаш-ю9п
    @АндрейБабаш-ю9п 2 роки тому +3

    Круто! Респект! Действительно годный материал)

  • @prostocrazy1105
    @prostocrazy1105 Рік тому

    уроки ШИК!

  • @temirkhanamanbaev42
    @temirkhanamanbaev42 3 роки тому +2

    Спасибо!

  • @mvzex
    @mvzex 4 роки тому +4

    Звук крутой, на что записываешь?

    • @beginend95
      @beginend95  4 роки тому +1

      USB микрофон Recording Tools MCU-01 Black

  • @redice8928
    @redice8928 Рік тому

    ты лучший

  • @Mickaelrf
    @Mickaelrf 9 місяців тому

    Здравствуйте
    Подскажите почему через указатель на указатель можно изменять значение только в первой ячейке памяти (под индексом 0) а в остальных не получается ? Выскакивает Segmentation fault.
    То есть
    void CreateInt (int **p)
    {
    *p = malloc(3 * sizeof(int));
    **p = 8; //Значение смениться в 0 ячейке указателя *a
    *p[1] = 5; //Значение не меняться , выходит ошибка Segmentation fault
    **(p + 2) = 11; ////Значение не меняться , выходит ошибка Segmentation fault
    }

  • @ostrov11
    @ostrov11 4 роки тому +5

    комментарий
    указатели на указатели как их использовать

  • @Старичок-ж2о
    @Старичок-ж2о 3 роки тому +2

    Аааааааа я перегорел)) указатель, на указатель, указателя, который указывает на указатель указателя)) в паскале, мне кажется проще все выраженно. может дело привычки а может я тупой)))

  • @preegnees6664
    @preegnees6664 3 роки тому +1

    Нормально, что я не понимаю это все с первого раза ? И такой вопрос: если у нас есть *а, то есть какая то ячейка "а", на которую он указывает? Если у нас есть **р2 (при условии, что мы не присваивали указателю никакого адреса), то это значит, что он указывает на *р2 (или что будет, тогда, такое *р2 относительно **р2), а это, в свою очередь, на р2? (Если ты это объяснял уже, то, видимо, я не заметил. Извини)

    • @beginend95
      @beginend95  3 роки тому +2

      Когда мы создаем *а, то у нас есть только ячейка памяти с адресом, т.е. *а. Чтобы *а указывала на "а" надо присвоить адрес другой переменной или выделить память.
      **р2 - это просто указатель на другой указатель. При этом создается только ячейка памяти с адресом. Т.е. *р2 и р2 при этом не создано.

    • @preegnees6664
      @preegnees6664 3 роки тому +1

      @@beginend95понял, спасибо большое )

  • @reks-iy4cf
    @reks-iy4cf Рік тому

    Спасибо за уроки!
    Почему если в функцию void CreateInt (int **p), передать не указатель на указатель **p, а просто указатель *p, то есть вот так - void CreateInt (int *p), то код работает так же?

    • @АлексейАлексеев-ц8х9т
      @АлексейАлексеев-ц8х9т 11 місяців тому

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

    • @reks-iy4cf
      @reks-iy4cf 10 місяців тому

      Спасибо.
      @@АлексейАлексеев-ц8х9т

  • @ДанилаДанила-ж8р
    @ДанилаДанила-ж8р 3 роки тому +1

    Священные знания. Долго пытался изменить значение указателя из другой функции пока не наткнулся на указатель на указатель.)))

  • @АлексейАлексеев-ц8х9т
    @АлексейАлексеев-ц8х9т 11 місяців тому

    со второго раза разобрался. В аргументе функции CreateInt избыточен указатель на указатель **p, достаточно обычного указателя *p, так как нам не нужен доступ дальше значения указателя *a

    • @lievsey
      @lievsey 17 днів тому

      Там если передавать в функцию в качестве входного параметра просто указатель, то получается, что функция должна изменить входной параметр. Если передать указатель указателя, то функции придётся изменить опять же указатель.
      В первом случае(я хз почему, но оно так) функция не сможет этого сделать, потому что она не может напрямую изменять значение входного параметра. Не знаю почему, но я пробовал это делать с другой функцией, которой передавал в качестве параметра обысную переменную, которую пытался изменить(присвоить ей др значение). И она не изменялась
      Такие дела

  • @AigarsZeiza
    @AigarsZeiza 3 роки тому

    широкую на широкую!

  • @bark205
    @bark205 3 роки тому

    Где лучшие уроки?

    • @bark205
      @bark205 3 роки тому

      У Антохи!

  • @leonid_spb
    @leonid_spb 3 роки тому

    Из этих всех уроков я не понял только одного: нафиг эти указатели вообще нужны? Зачем какие-то адреса в памяти, а тем более адреса на адреса в памяти....? Нафига городить такой огород, если можно просто передавать по значению и вообще не задаваться вопросом о том, в какой области памяти что лежит?

    • @moshamiracle
      @moshamiracle 2 роки тому +5

      Например, есть функция, которая что-то делает с твоей структурой и изменяет ее поля. Ты создал структуру и передаешь в эту функцию указатель на эту структуру и внутри функции все меняется и после нее у тебя в коде уже измененная структура.
      А иначе, если передаем "значение", т.е. всю структуру целиком, то:
      1) во время передачи в функцию создается копия структуры, которая передается в функцию
      2) внутри функции с этой копией что-то делается и присваивается
      3) мы возвращаем из функции также целую получившуюся структуру и должны будем еще раз присвоить уже ее значения нашей первой структуре
      ..
      а если у нас структура большая.. и там 20 полей да еще со своими структурами..
      Вывод: нужно для того, чтобы программы работали гораздо быстрее. Я бы назвала это как основное их использование.

  • @whocares7141
    @whocares7141 2 роки тому

    Указатель на указатель это конечно взрыв мозга, кто-нибудь может прокомментировать правильно ли сделаноЖ
    #include
    #include
    void CreateInt(int **p)
    {
    if (p !=0)
    {
    free(*p);
    *p = NULL;
    }
    }
    int main()
    {
    int z = 100;
    int *a = NULL;
    a = &z;
    *a = 200;
    printf("Before magic! adress %d, number %d
    ", a, z);
    CreateInt(&a);
    printf("Some magic! adress %d, number %d
    ", a, z);
    return 0;