Цитата(Panych @ Jul 17 2009, 10:10)

Где-то вроде видел такую запись. Почему-то отложилась как работающая. Двумерные раньше не использовал.
Она действительно работает. Только означает она не то, что вы подумали, а "указатель на указатель на char". Поскольку (как отметил
Dog Pawlowa) массив фактически в памяти расположен одномерно, то "двумерный" указатель должен содержать (знать на этапе компиляции) одну из размерностей.
Цитата(Panych @ Jul 17 2009, 10:10)

Но хотелось бы потренироваться. Как я понимаю, надо объявить указатель на строки в двумерном массиве. И передавать в функции уже именно указатель на конкретную строку.
Да, совершенно верно.
Код
#define LINE_SIZE 10
typedef uint8_t line_t[LINE_SIZE]; // новый тип "строка массива"
line_t Array[4]; // массив 10*4
void func1(line_t line) // синтаксически передается строка.
{ // однако по правилам С массивы передаются не по значению,
// а по указателю. Поэтому работаем со строкой как с одномерным массивом.
printf(" %d ",line[1]);
}
void func2(line_t * line) // явно передаем указатель на строку
{
printf(" %d ",(*line)[2]);
}
void func3(line_t * line) // он же указатель на массив
{
printf(" %d ",line[3][2]);
}
int main()
{
for(uint8_t y = 0; y < sizeof(Array) / sizeof(Array[0]); ++y)
for(uint8_t x = 0; x < sizeof(line_t); ++x)
Array[y][x] = x + y * sizeof(line_t);
func1(Array[1]);
func2(&Array[2]);
func3(Array);
return EXIT_SUCCESS;
}
Чуть позже выложу пример без объявления типа.