LINUX.ORG.RU

Многомерные массивы и указатели в ANSI C

 


1

1

Вот с тем как использовать указатель на одномерный массив в функции понятно, но проблема возникает, если работа идет с, например, двумерными массивами. Если у функции формальные параметры описать как массивы, то все вполне работает, а,вот, описать, используя синтаксис именно как указателей не получается. Пример:

#include<stdio.h>
#define COLS 4 
void print_array(int arr[][COLS], int column, int row);
int main()
{
	int arr[4][4] = { {0,1,2,3},{0,1,2,8} };
	print_array(arr, 2, 4);
	print_array2(arr, 2, 4);
	return 0;

}
void print_array(int   arr [][COLS], int column, int row)
{
	for (int i = 0; i < column; i++)
	{
		printf("\n");
		for (int j = 0; j < row; j++)
		{
			printf("%d",arr[i][j]);
		}

		
	}
}
Как написать функцию print_array, но с параметрами-указателями в явном виде?

★★★★★

Многомерные массивы это именно массивы массовов (int (*)[N]), которые лежат один за другим в памяти. Как ни крути, а массивами указателей они не станут (int **). Можно брать указатель на первый элемент и считать многомерные индексы самостоятельно (выравнивание не должно вмешиваться, вроде), либо делать разные функции для массивов разных размеров.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)

Посмотри, как в том же GSL или опенгле делается: там не заморачиваются с бешеными массивами указателей (мало того, что трата памяти, так еще и лишние операции по разыменованию), а хранят все данные последовательно в одном массиве, разве что для ускорения выравнивают (т.е., скажем, двумерный массив имеет характеристики W, H и S, где S — смещение адреса элемента следующей строки, а W и H — тупо ширина и высота).

anonymous
()

так ты сначала попробуй сам написать, а потом уже задавай вопросы, что конкретно «не получается». там ничего сложного нет, в любом учебнике по С масса примеров на эту тему.

Iron_Bug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.