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
C/C++
Как передать двухмерный массив в качестве аргумента через указатель.
Хочу создать функцию, которая выводит двухмерный массив.
char [x] при передаче превращается в char* (а размер x теряется)
char[x][y] при передаче превращается в char(*)[y] - весьма специфический указатель не совместимый с char**, который теряет размер x но помнит размер y.
универсальный способ передачи различных типов двумерных массивов - использовать шаблоны.
еще лучше - добавить ссылочный тип и модификатор const:
(const - раз уж функция не изменяет содержание, а только выводит содержимое, то лучше добавлять такую гарантию неизменяемости).
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 - раз уж функция не изменяет содержание, а только выводит содержимое, то лучше добавлять такую гарантию неизменяемости).
char** - это массив указателей, который в памяти лежит так:
char[w][h] - это непрерывный участок памяти:
Поэтому они и несовместимы.
Нужно либо передавать char[][], с известными константными (времени компиляции) размерностями, кроме последней, либо хранить данные в массиве указателей со всеми вытекающими (повышенный расход памяти, отсутствие локальности данных, необходимость освобождать указатели на массивы char).
[
char* --> ['a', 'b', ...]
char* --> ['0', '1', ...]
char* --> ['!', '&', ...]
...
]
Т.е. каждый указатель ссылается на область памяти, которая может быть где угодно.char[w][h] - это непрерывный участок памяти:
['a', 'b', ..., '0', '1', ..., '!', '&', ...]
И здесь указатели на одномерные массивы не хранятся.Поэтому они и несовместимы.
Нужно либо передавать char[][], с известными константными (времени компиляции) размерностями, кроме последней, либо хранить данные в массиве указателей со всеми вытекающими (повышенный расход памяти, отсутствие локальности данных, необходимость освобождать указатели на массивы char).
Вот пример кода на C++, который позволяет передавать двумерный массив в качестве аргумента через указатель и выводит его на экран:
#include
using namespace std;
void print_array(int** arr, int rows, int cols){
for(int i=0; i
Похожие вопросы
- Написать РЕКУРСИВНУЮ функцию, которая принимает двухмерный массив целых чисел и выполняет круговой сдвиг массива ВЛЕВО.
- Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет
- Помогите написать программу по обработке двухмерного массива в с++
- Двухмерный массив с++
- Двухмерный массив 4x4
- С++ | Надо отсортировать двухмерный массив N*M в порядке возрастания и спадания ПО КАЖДОМУ СТОЛБЦУ ОТДЕЛЬНО
- Программирование на языке C++. Двухмерные массивы чисел
- Задача C++ с двухмерными массивами
- Лабораторная работа. Классы. Передача объекта в качестве аргумента.
- Почему динамический массив напрямую в функцию передать нельзя, а динамический массив указателей можно?