C/C++

Как передать двухмерный массив в качестве аргумента через указатель.

Хочу создать функцию, которая выводит двухмерный массив.
 void arr_out(char** arr, const size_t widht, const size_t height) { 
for (int i1 = 0; i1 < height; i1++) {
for (int i2 = 0; i2 < widht; i2++) {
cout
char [x] при передаче превращается в char* (а размер x теряется)
char[x][y] при передаче превращается в char(*)[y] - весьма специфический указатель не совместимый с char**, который теряет размер x но помнит размер y.

универсальный способ передачи различных типов двумерных массивов - использовать шаблоны.
 template
void arr_out (T arr, const size_t width, const size_t height)
Такой способ подойдет и для указателей типа ** и для (*)[] c любым типом переменных.

еще лучше - добавить ссылочный тип и модификатор const:
 template 
void arr_out (const T& arr, const size_t width, const size_t height)
тогда можно передавать даже векторы без необходимости копирования
(const - раз уж функция не изменяет содержание, а только выводит содержимое, то лучше добавлять такую гарантию неизменяемости).
ВК
Виктор Копылов
51 417
Лучший ответ
char** - это массив указателей, который в памяти лежит так:
 [
char* --> ['a', 'b', ...]
char* --> ['0', '1', ...]
char* --> ['!', '&', ...]
...
]
Т.е. каждый указатель ссылается на область памяти, которая может быть где угодно.

char[w][h] - это непрерывный участок памяти:
 ['a', 'b', ..., '0', '1', ..., '!', '&', ...] 
И здесь указатели на одномерные массивы не хранятся.

Поэтому они и несовместимы.

Нужно либо передавать char[][], с известными константными (времени компиляции) размерностями, кроме последней, либо хранить данные в массиве указателей со всеми вытекающими (повышенный расход памяти, отсутствие локальности данных, необходимость освобождать указатели на массивы char).
ОП
Олег Пугин
54 053
 Вот пример кода на C++, который позволяет передавать двумерный массив в качестве аргумента через указатель и выводит его на экран:

#include
using namespace std;

void print_array(int** arr, int rows, int cols){
for(int i=0; i