Дмитрий, это типа вообще не имеет смысла. Если у тебя одномерный массив, как ты к нему обратишься по двум индексам? Нужно либо делать нормальный двухмерный, либо (если прям очень-очень нужно именно одномерный) пересчитывать два индекса в один самостоятельно.
Такими темпами ты будешь очень долго разбираться. Потому что сдаётся мне, ты хотел сказать типа данных "массив". Всё же терминологию нужно запоминать, проще гуглить будет.
Ну и да - есть там массивы, просто нужно понимать их специфику. Вообще за этим лучше в учебник.
Skatilsya, в приведённом примере просто используется указатель. Простейший вид массива в Си устроен именно так - как указатель на нулевой элемент массива, его начало. Поэтому и указатель можно использовать как массив. По сути, M[i] будет преобразовываться в обращение к адресу памяти M + i * sizeof(float), и по этому адресу будет читаться/записываться float.
Как я уже писал, можно сделать двухмерный массив двумя способами. Первый - "честный", через двойной указатель: float** M;
Тогда у тебя будет массив указателей на строки, каждый из которых можно интерпретировать как одномерный массив (строку float'ов). Плюс - работаешь с массивом как обычно, M[row][col]. Кроме того, строки в массиве могут иметь разную длину (если это надо).
Минус в том, что такой массив утомительно создавать/уничтожать - тебе придётся сначала создать массив указателей, потом инициализировать каждый элемент адресом массива-строки. Уничтожение в обратном порядке. Кроме того, массив может располагаться в памяти в разнобой - иногда это недопустимо, например, для изображений.
Альтернативно, делаешь одномерный массив, как у тебя, просто сам пересчитываешь индексы в индекс этого массива. idx = row * W + col, где W - число столбцов в массиве, т.е. длина одной строки. А потом обращаешься к M[idx]. Тут обращение сложнее, но зато создавать/уничтожать массив проще, и он точно будет идти в памяти подряд.