Для того чтобы создать двумерный динамический массив на си необходимо выделить память под один одномерный массив, элементами которого будут также являться одномерные массивы. Пусть наш массив будет называться А и хранить в себе целочисленные значения. Для начала необходимо вспомнить, что имя массива содержит в себе ссылку на первый элемент, поэтому мы будем использовать указатель (*). Так как массив A будет двумерным, то он будет указывать на элемент, который также будет являться массивом. То есть для него также потребуется указатель, тогда его объявление будет выглядеть следующим образом: int** a, то есть указатель, на указатель на int...
Динамические массивы в общем и целом похожи на обычные массивы фиксированной длинны за исключением некоторых моментов. Для работы с динамическим массивом уже требуются начальные знания и понимание работы указателей. В случае, где размерность массива задается пользователем необходимо применят динамические массивы. Для его объявления требуется использовать специальную функцию выделения памяти new. int num; // размер массива, в дальнейшем принимается из потока ввода. int *arr = new int[num]; // выделение памяти для элементов массива. В данном объявлении видно как объявляется указатель на элемент целочисленного типа *arr после чего происходит присвоение выделенной памяти...