Двумерные массивы в Си: обычные и динамические
Вставка
- Опубліковано 12 сер 2018
- Обычные двумерные массивы в С.
Передача двумерного массива в функцию.
Динамические двумерные массивы в С.
Выделение и освобождение памяти для динамического двумерного массива.
Передача динамического двумерного массива в функцию и возврат из функции.
Курс молодого бойца по информатике (Язык Си).
cs.mipt.ru/c_intro
Спасибо огромное, ученики школы 21 зимнего бассейна 2022 года благодарны вам!
Ученики школы 21 снова передают вам привет и огромное спасибо
Спасибо Вам большое, ученики школы 21 осеннего бассейна 2023!
Спасибо вам большое от учеников школы 21 (14/02/2022)
ученики школы 21 вам благодарны
На месте😎
Заха
Отдыхаем
однозначно!
СПАСИБО Вам Тимофей за все курсы, каждый урок бесценен, иногда смотрел по 2-3 раза просто для кайфа и укладки, еще хочу сказать спасибо Вам за уроки в Фоксфорде. Вы настоящий джедай. (надеюсь когда-нибудь с вами встречусь)
я 7 часов искал причину вылета, оказалось что забыл поставить звезду во втором инте при объявление двумерного динамического массива, у тебя +1 подписчик теперь)
Поздравления! Дима праздник! У Димы праздник! Я все закончил с этим!! Праздник! Как раз майские праздники! Да, многомерный массив- штука крайне хитрая.... ЗВерята радуются! Цыпленок радуется! Утенок радуется! Дима радуется! кролик радуется! Совенок радуется!!🐤🦉🦆🐸🐧🐦
Спасибо! School 21
21/09/22 - sheritsh
ахренеть как доходчиво оба метода будут полезными! огромное спасибо!!!!!!!!!
Спасибо большое от дядьки 36 лет =) Просто бог объяснения ^^
Огромное человеческое спасибо за столь прекрасные уроки
Благодарю за лекцию. Очень жалко, что все так быстро закончилось. Динамический двумерный массив как-то тяжело прошел. Как-нибудь под настроение, пожалуйста, сделайте продолжение.
Спасибо вам от учеников школы 21!!!!
Спасибо за инфу. Очень помогло
Новомодный способ одного маллока не работает. Тимофей Фёдорович, будем признательны, если разберёте его более подробно с выводом на экран элементов и назначением отдельных элементов.
привет от августовского (2023 г) интенсива школы 21! Peer to peer
Большущее спасибо, тяжело понять материал, пришлось Ваш код взять
Не получилось с помощью кода из видео указателем пройти по динамическому массиву. Сначала все хорошо: проходит массив А[0] и выводит 1, 2, 3, 4, 5 в нашем случае. А дальше шагает физически по памяти до самого конца или до последнего элемента массива A[3], как получится :)
Повозившись с кодом проблему так же решить не смог. Как тут быть и правильно гулять по элементам массива с помощью поинтеров?
Спасибо большое
привет и спасибо от учеников школы 21!:)
будущим бассейнистам шк 21 привет :))
И вам не болеть!
Вся школа 21 ликует. Спасибо!
Спасибо!
спасибо!
Ученики благодарны вам с августовского бассейна
Привет от детей школы 21
Почему нельзя писать в условии цикла p < p + 20 ? это вызывает ошибку при выполнение.
Могу предположить, что раз вы с каждой итерацией увеличиваете переменную P, то цикл так-то будет бесконечным, ибо P в условии вашем тоже меняется с каждой итерацией.
@@user-mn3tm2qg6y да, это так
Меньше писанины и лучшее распределение памяти - это по мне )
и от весеннего бассейна 2024 :)
Вот что непонятно, зачем нам создавать отличные структуры при работе с статическим и динамическим, почему бы просто не создать в динамической памяти аналог статического двумерного массива? без лишнего набора ссылок? Вся эта канитель, с динамическим массивом, нужна чтоб удобным способом [ ][ ] получать доступ к данным, и код читаемым был. Но для этого нам нужно сделать неудобную реализацию и лишнюю память использовать на указатели. Что и скорость снизит. Так же хотелось бы узнать как не ровный двумерный массив реализуется, где подмассивы разного размера.
И снова ученики школы 21 говорят спасибо 😊
Очень интересно, но ничего не понятно.
почему не int * start = (int *)A + N * sizeof(int *)? для чего нужно (char *)?
Чтобы шагать побайтово, а не по 4 байта (это размер int).
В действительности можно и нужно это всё упростить до:
_int * start = (int *)(A + N);_
@@7qim только, наверное, последние скобки лишние:
надо int *start = (int *)A + N; - вот тогда мы отшагнем N раз по размеру (int *).
А в варианте int * start = (int *)(A + N); - мы сначала отшагнем N раз по размеру (int **) - это изначальный тип A, а потом уже итог приведем к (int *).
Хотя, возможно, размер (int **) и (int *) гаранитровано одинаковые - этот момент я не знаю...
Жаль нельзя второй лайк поставить
Ужас как сложно, придется не один раз пересматривать, чтоб уловить суть.
всё проще на практике, просто объясняют херово
@@MrMikhailDJ нее этот дядька объясняет как надо ) когда я учился процесс объяснения был примерно такой "нет времени объяснять дойдём до лаб научитесь"дошли до лаб "вот лабы индивидуальные чтоб не списывали, вон гугл - вперёд" :)
Юрий Колесник хз у меня в унике этому вопросу уделалась 1 лекция и 1 семинар. Я считаю что 90 минут теории и 90 минут практики достаточно, чтобы понять. Ну и плюс лаба на которой уже точно всё уясниться
@@MrMikhailDJ Везет вам, у нас вообще дают на практике задания на подобии: "Спросить у пользователя число N. Сгенерировать динамический массив размером NхN, заполненный целыми числами подряд.Вычислить сумму элементов (ромбом)." И уходят, ни лекции, ни нормальной практики, как учится... ? Они видимо думают, что мы за первый семестр выучили СИ, но мы проскакали все очень быстро, по 2 темы за пару проходили...
@@user-nw2eb6lx1k ну это смотря какой универ. Я учусь в мгту им баумана на РК6, там сапр и очень много проги. Поэтому и уровень такой
School 21!
Сделал чтобы были 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("
");
}
}
нашел другой пример создания двумерного массива:
int *a; // указатель на массив
a = (int*)malloc(n*m * sizeof(int)); // n-колличесвто строк, m-столбцов
free(a);
ты не так освобождаешь память
Так это по сути своей одномерный массив, который состоит не из N элементов, а N*M. Для двумерности нужно тогда создать ещё массив указателей, и присоединять каждый указатель после N-го элемента, тогда да - это можно будет назвать двумерным массивом.
// Очистка памяти
for (i = 0; i < n; i++) // цикл по строкам
free(a[i]); // Освобождение памяти для строк матрицы
free(a); // Освобождение памяти для массива указателей
@@ZStanislav нет, поскольку a это одномерный динамисеский массив интов а не указателей, освобождение памяти: free(a);
13:50
Надо было смелее и дальше упрощать до _"A + N"_ вместо _"(char *)A + N * sizeof(int *)"_
интересно, с double это сработает? А то чето сега вылетает, не по глазам где ошибка закралась
Достопочтенный, объясните пожалуйста, для чего мы это пишем, типо память мы выделили, а вот это и последующие для чего?
@@catastrophic3709 В начале выделенной памяти у нас будут лежать адреса, по которым будут лежать уже сами значения элементов массива (полезные данные), которые, в свою очередь, будут идти сразу после всех этих адресов, поэтому переменная "start" как раз-таки указывает на смещение начала непосредственных значений массива (полезных данных). Далее в цикле распределяем адреса значений для каждого из элементов массива, то есть инициализируем самое начало выделенной памяти.
@@7qim То есть, правил но ли я понял, мы сперва выделяем пямять под массив указателей и элементы массива, далее в переменной "start", мы смещаемся с массива указателей на начальные элементы массива и в цикле мы даём адресс самим элементам?
@@catastrophic3709 Да.
А как вам такой вариант?
#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;
}
Идея в том, что мы просто передаём в функцию адрес первого элемента массива, а дальше всё вычисляем с помощью адресной арифметики. При этом функция получается универсальной, нет никаких дефайнов или страшных двойных указателей.
А если размеры вводит пользователь?
ошибка на титульном листе урока. название следующего видео
интересно, Джон Кармак знал про этот читерский способ во времена разработки игрового движка? )
он на нем написан
школа 21 летний бассейн 2023 всем привет
Малока
всю серию ждал, когда ты вызовешь calloc (именно С), но чуда не произошло, увы
Зачем вообще нужно развивать тему многомерных динамических массивов?Без них можно обойтись если учесть тот факт,что современные компьютеры такие скоросные и мощные,что памяти сполна хватит без экономии(ведь ради этого именно в древние времена развивали эту тему)?
статичские массивы на стеке выделяются, а там много не выделишь ) а динамикой в куче
Зато в питоне ты такой просто [][]