Двумерные массивы в Си: обычные и динамические

Поділитися
Вставка
  • Опубліковано 12 сер 2018
  • Обычные двумерные массивы в С.
    Передача двумерного массива в функцию.
    Динамические двумерные массивы в С.
    Выделение и освобождение памяти для динамического двумерного массива.
    Передача динамического двумерного массива в функцию и возврат из функции.
    Курс молодого бойца по информатике (Язык Си).
    cs.mipt.ru/c_intro

КОМЕНТАРІ • 78

  • @user-dd6pz2wt6z
    @user-dd6pz2wt6z 2 роки тому +50

    Спасибо огромное, ученики школы 21 зимнего бассейна 2022 года благодарны вам!

  • @danielklimovoff
    @danielklimovoff 2 роки тому +48

    Ученики школы 21 снова передают вам привет и огромное спасибо

  • @mksmvnv
    @mksmvnv 6 місяців тому +11

    Спасибо Вам большое, ученики школы 21 осеннего бассейна 2023!

  • @nikitatikhonov5187
    @nikitatikhonov5187 2 роки тому +33

    Спасибо вам большое от учеников школы 21 (14/02/2022)

  • @sekta817
    @sekta817 2 роки тому +70

    ученики школы 21 вам благодарны

  • @Mani_Fast
    @Mani_Fast 2 роки тому +6

    СПАСИБО Вам Тимофей за все курсы, каждый урок бесценен, иногда смотрел по 2-3 раза просто для кайфа и укладки, еще хочу сказать спасибо Вам за уроки в Фоксфорде. Вы настоящий джедай. (надеюсь когда-нибудь с вами встречусь)

  • @Master_Mollan
    @Master_Mollan 9 місяців тому +1

    я 7 часов искал причину вылета, оказалось что забыл поставить звезду во втором инте при объявление двумерного динамического массива, у тебя +1 подписчик теперь)

  • @dimalink4486
    @dimalink4486 Рік тому +3

    Поздравления! Дима праздник! У Димы праздник! Я все закончил с этим!! Праздник! Как раз майские праздники! Да, многомерный массив- штука крайне хитрая.... ЗВерята радуются! Цыпленок радуется! Утенок радуется! Дима радуется! кролик радуется! Совенок радуется!!🐤🦉🦆🐸🐧🐦

  • @user-hc1yw4tu8t
    @user-hc1yw4tu8t Рік тому +5

    Спасибо! School 21
    21/09/22 - sheritsh

  • @McGewen
    @McGewen 4 роки тому +2

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

  • @user-ry6go9cw9o
    @user-ry6go9cw9o Рік тому +2

    Спасибо большое от дядьки 36 лет =) Просто бог объяснения ^^

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

    Огромное человеческое спасибо за столь прекрасные уроки

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

    Благодарю за лекцию. Очень жалко, что все так быстро закончилось. Динамический двумерный массив как-то тяжело прошел. Как-нибудь под настроение, пожалуйста, сделайте продолжение.

  • @le0messi
    @le0messi 7 місяців тому +2

    Спасибо вам от учеников школы 21!!!!

  • @halavich9672
    @halavich9672 5 років тому +1

    Спасибо за инфу. Очень помогло

  • @tolstenev_gleb
    @tolstenev_gleb Рік тому +3

    Новомодный способ одного маллока не работает. Тимофей Фёдорович, будем признательны, если разберёте его более подробно с выводом на экран элементов и назначением отдельных элементов.

  • @arzimanoff
    @arzimanoff 9 місяців тому +2

    привет от августовского (2023 г) интенсива школы 21! Peer to peer

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

    Большущее спасибо, тяжело понять материал, пришлось Ваш код взять

  • @yesugibe7041
    @yesugibe7041 4 роки тому +3

    Не получилось с помощью кода из видео указателем пройти по динамическому массиву. Сначала все хорошо: проходит массив А[0] и выводит 1, 2, 3, 4, 5 в нашем случае. А дальше шагает физически по памяти до самого конца или до последнего элемента массива A[3], как получится :)
    Повозившись с кодом проблему так же решить не смог. Как тут быть и правильно гулять по элементам массива с помощью поинтеров?

  • @user-nu1jj6bt9j
    @user-nu1jj6bt9j 3 роки тому +1

    Спасибо большое

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

    привет и спасибо от учеников школы 21!:)

  • @candarly
    @candarly 7 місяців тому +2

    будущим бассейнистам шк 21 привет :))

    • @tkhirianov
      @tkhirianov  7 місяців тому +2

      И вам не болеть!

  • @day_spa
    @day_spa 2 роки тому +1

    Вся школа 21 ликует. Спасибо!

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

    Спасибо!

  • @user-ig8fh5cx4u
    @user-ig8fh5cx4u 2 роки тому

    спасибо!

  • @shoqun6360
    @shoqun6360 Рік тому +2

    Ученики благодарны вам с августовского бассейна

  • @ginger.samurai
    @ginger.samurai Рік тому +2

    Привет от детей школы 21

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

    Почему нельзя писать в условии цикла p < p + 20 ? это вызывает ошибку при выполнение.

    • @user-mn3tm2qg6y
      @user-mn3tm2qg6y 3 роки тому

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

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

      @@user-mn3tm2qg6y да, это так

  • @ZStanislav
    @ZStanislav 4 роки тому

    Меньше писанины и лучшее распределение памяти - это по мне )

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

    и от весеннего бассейна 2024 :)

  • @arvgo41
    @arvgo41 10 місяців тому

    Вот что непонятно, зачем нам создавать отличные структуры при работе с статическим и динамическим, почему бы просто не создать в динамической памяти аналог статического двумерного массива? без лишнего набора ссылок? Вся эта канитель, с динамическим массивом, нужна чтоб удобным способом [ ][ ] получать доступ к данным, и код читаемым был. Но для этого нам нужно сделать неудобную реализацию и лишнюю память использовать на указатели. Что и скорость снизит. Так же хотелось бы узнать как не ровный двумерный массив реализуется, где подмассивы разного размера.

  • @tony_slark4757
    @tony_slark4757 4 місяці тому

    И снова ученики школы 21 говорят спасибо 😊

  • @namename2031
    @namename2031 2 роки тому +2

    Очень интересно, но ничего не понятно.

  • @fen-siz
    @fen-siz 2 роки тому

    почему не int * start = (int *)A + N * sizeof(int *)? для чего нужно (char *)?

    • @7qim
      @7qim 2 роки тому

      Чтобы шагать побайтово, а не по 4 байта (это размер int).
      В действительности можно и нужно это всё упростить до:
      _int * start = (int *)(A + N);_

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

      @@7qim только, наверное, последние скобки лишние:
      надо int *start = (int *)A + N; - вот тогда мы отшагнем N раз по размеру (int *).
      А в варианте int * start = (int *)(A + N); - мы сначала отшагнем N раз по размеру (int **) - это изначальный тип A, а потом уже итог приведем к (int *).
      Хотя, возможно, размер (int **) и (int *) гаранитровано одинаковые - этот момент я не знаю...

  • @user-mm9zd5uh7o
    @user-mm9zd5uh7o 8 місяців тому

    Жаль нельзя второй лайк поставить

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

    Ужас как сложно, придется не один раз пересматривать, чтоб уловить суть.

    • @MrMikhailDJ
      @MrMikhailDJ 4 роки тому

      всё проще на практике, просто объясняют херово

    • @user-td4kl8er7g
      @user-td4kl8er7g 4 роки тому +9

      @@MrMikhailDJ нее этот дядька объясняет как надо ) когда я учился процесс объяснения был примерно такой "нет времени объяснять дойдём до лаб научитесь"дошли до лаб "вот лабы индивидуальные чтоб не списывали, вон гугл - вперёд" :)

    • @MrMikhailDJ
      @MrMikhailDJ 4 роки тому

      Юрий Колесник хз у меня в унике этому вопросу уделалась 1 лекция и 1 семинар. Я считаю что 90 минут теории и 90 минут практики достаточно, чтобы понять. Ну и плюс лаба на которой уже точно всё уясниться

    • @user-nw2eb6lx1k
      @user-nw2eb6lx1k 4 роки тому

      @@MrMikhailDJ Везет вам, у нас вообще дают на практике задания на подобии: "Спросить у пользователя число N. Сгенерировать динамический массив размером NхN, заполненный целыми числами подряд.Вычислить сумму элементов (ромбом)." И уходят, ни лекции, ни нормальной практики, как учится... ? Они видимо думают, что мы за первый семестр выучили СИ, но мы проскакали все очень быстро, по 2 темы за пару проходили...

    • @MrMikhailDJ
      @MrMikhailDJ 4 роки тому

      @@user-nw2eb6lx1k ну это смотря какой универ. Я учусь в мгту им баумана на РК6, там сапр и очень много проги. Поэтому и уровень такой

  • @user-ps2oz5os2g
    @user-ps2oz5os2g Рік тому +1

    School 21!

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

    Сделал чтобы были 4 строки и 5 колонок:
    void static_array_print2(int A[ ][MATRIX_WIDTH]) {
    for (int* p = (int*)A, i = 0; p < (int*)A + N; p++, i++) {
    for (int j = 0; j < MATRIX_WIDTH; j++)
    printf("%3d", *(p + i * N + j));
    printf("
    ");
    }
    }

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

    нашел другой пример создания двумерного массива:
    int *a; // указатель на массив
    a = (int*)malloc(n*m * sizeof(int)); // n-колличесвто строк, m-столбцов
    free(a);

    • @user-mv3fh2bt3z
      @user-mv3fh2bt3z 4 роки тому

      ты не так освобождаешь память

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

      Так это по сути своей одномерный массив, который состоит не из N элементов, а N*M. Для двумерности нужно тогда создать ещё массив указателей, и присоединять каждый указатель после N-го элемента, тогда да - это можно будет назвать двумерным массивом.

    • @ZStanislav
      @ZStanislav 4 роки тому

      // Очистка памяти
      for (i = 0; i < n; i++) // цикл по строкам
      free(a[i]); // Освобождение памяти для строк матрицы
      free(a); // Освобождение памяти для массива указателей

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

      @@ZStanislav нет, поскольку a это одномерный динамисеский массив интов а не указателей, освобождение памяти: free(a);

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

    13:50
    Надо было смелее и дальше упрощать до _"A + N"_ вместо _"(char *)A + N * sizeof(int *)"_

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

      интересно, с double это сработает? А то чето сега вылетает, не по глазам где ошибка закралась

    • @catastrophic3709
      @catastrophic3709 6 місяців тому

      Достопочтенный, объясните пожалуйста, для чего мы это пишем, типо память мы выделили, а вот это и последующие для чего?

    • @7qim
      @7qim 6 місяців тому +1

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

    • @catastrophic3709
      @catastrophic3709 6 місяців тому

      @@7qim То есть, правил но ли я понял, мы сперва выделяем пямять под массив указателей и элементы массива, далее в переменной "start", мы смещаемся с массива указателей на начальные элементы массива и в цикле мы даём адресс самим элементам?

    • @7qim
      @7qim 6 місяців тому +1

      @@catastrophic3709 Да.

  • @X-Under
    @X-Under 2 роки тому

    А как вам такой вариант?
    #include
    #include
    void print_array2(int *arr, int row, int col)
    {
    for (int i = 0; i < row; i++)
    {
    for (int j = 0; j < col; j++)
    printf("%5d", *(arr + i * col + j));
    printf("
    ");
    }
    }
    int main()
    {
    int m[3][5] = {0};
    print_array2(&m[0][0], 3, 5);
    return 0;
    }
    Идея в том, что мы просто передаём в функцию адрес первого элемента массива, а дальше всё вычисляем с помощью адресной арифметики. При этом функция получается универсальной, нет никаких дефайнов или страшных двойных указателей.

    • @abstergo72
      @abstergo72 Рік тому +1

      А если размеры вводит пользователь?

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

    ошибка на титульном листе урока. название следующего видео

  • @ImmortalBest
    @ImmortalBest 5 років тому +5

    интересно, Джон Кармак знал про этот читерский способ во времена разработки игрового движка? )

    • @McGewen
      @McGewen 4 роки тому

      он на нем написан

  • @user-ee8sv9pz9x
    @user-ee8sv9pz9x 11 місяців тому +1

    школа 21 летний бассейн 2023 всем привет

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

    Малока

  • @user-mp7lq3cu9c
    @user-mp7lq3cu9c Рік тому

    всю серию ждал, когда ты вызовешь calloc (именно С), но чуда не произошло, увы

  • @user-nd4sl1lp9b
    @user-nd4sl1lp9b 10 місяців тому

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

    • @vasyaputin9628
      @vasyaputin9628 6 місяців тому

      статичские массивы на стеке выделяются, а там много не выделишь ) а динамикой в куче

  • @user-fq7lj9cs8n
    @user-fq7lj9cs8n 2 роки тому

    Зато в питоне ты такой просто [][]