Ссылка на массив указателей. C++

423
13 марта 2017, 11:25

Есть ли какой-нибудь способ сделать ссылку на массив указателей?

Конкретнее: Есть функция сортировки двухмерного массива, которая работает не с самим массивом а с массивом указателей на него. После сортировки нужно из этой функции вызвать функцию вывода массива на экран в виде таблицы, которая должна работать с ссылкой на массив...

Возможно я что-то не понимаю, но с ссылкой нельзя работать как с двухмерным массивом (что мне нужно), поэтому передать туда двухмерный массив - нельзя.

P.S. исходная задача:

Разработайте программу, в которой пользователь с помощью меню может осуществить следующие действия:

  • заполнить случайным образом целыми числами из диапазона [-200; 200] двумерный массив, содержащий 6х9 элементов.
  • заменить все элементы массива, меньшие n (n вводится пользователем) на 0.
  • реализуйте функцию, выполняющую сортировку строки (указанна пользователем) в порядке убывания и передайте в качестве параметра двумерный массив по указателю.
  • реализуйте функцию вывода двумерного массива на экран в виде матрицы и передайте ей массив по ссылке.

У меня уже есть решение этой задачи НО без указателей и ссылок, с ними все проблемы.

Answer 1

реализуйте функцию, выполняющую сортировку строки (указанна пользователем) в порядке убывания и передайте в качестве параметра двумерный массив по указателю

Если имеется объявление двумерного массива примерно следующим образом

const size_t M = 10;
const size_t N = 20;
// ...
int a[M][N];

то объявление функции сортировки строки массива может выглядеть следующим образом

void sort_row( int ( *a )[N], size_t m, size_t row );

Функция может быть вызвана как

sort_row( a, M, row );

Другая возможность объявить функцию - это следующая

void sort_row( int ( *a )[M][N], size_t row );

и функция может быть вызвана как

sort_row( &a, row );

реализуйте функцию вывода двумерного массива на экран в виде матрицы и передайте ей массив по ссылке

Данная функция может быть объявлена как

void display_matrix( const int ( &a )[M][N] );

и вызвана как

display_matrix( a );

Или может быть объявлена как

std::ostream & display_matrix( const int ( &a )[M][N], std::ostream &os = std::cout );

и вызвана как

display_matrix( a );

Вам не нужно из функции сортировки строки массива вызывать функцию вывод массива на консоль. Можно вывод функции на консоль вызвать из main после вызова функции сортировки строки.

Вот демонстрационная программа вывода массива на консоль

#include <iostream>
#include <iomanip>
const size_t M = 3;
const size_t N = 4;
void display_matrix( const int ( &a )[M][N] )
{
    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            std::cout << std::setw( 3 ) << a[i][j] << ' '; 
        }
        std::cout << '\n';
    }
}
int main() 
{
    int a[M][N] =
    {
        { 1,  2,  3,  4 },
        { 5,  6,  7,  8 },
        { 9, 10, 11, 12 }
    };
    display_matrix( a );
    return 0;
}

Или

#include <iostream>
#include <iomanip>
const size_t M = 3;
const size_t N = 4;
std::ostream &  display_matrix( const int ( &a )[M][N], std::ostream &os = std::cout )
{
    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            os << std::setw( 3 ) << a[i][j] << ' '; 
        }
        os << '\n';
    }
    return os;
}
int main() 
{
    int a[M][N] =
    {
        { 1,  2,  3,  4 },
        { 5,  6,  7,  8 },
        { 9, 10, 11, 12 }
    };
    display_matrix( a );
    return 0;
}

Будет получен следующий вывод

  1   2   3   4 
  5   6   7   8 
  9  10  11  12 

Константы

const size_t M = 10;
const size_t N = 20;

должны быть объявлены перед объявлением функций, так как они используются в объявлении функций (при условии, что вы не будете объявлять эти функции как шаблонные).

C++ не разрешает использовать массивы переменной длины, хотя некоторые компиляторы имеют собственные расширения языка с данной поддержкой. Поэтому размеры массива должны быть заданы как константы.

Answer 2

Есть ли какой-нибудь способ сделать ссылку на массив указателей?

Чтобы не путаться с типами, можно работать последовательно:

using pointer = int*;
template <size_t N>
using array_of_pointers = pointer[N];
template <size_t N>
using reference_to_array_of_pointers = array_of_pointers<N>&;
READ ALSO
Нужно чтобы числа рандомились с 97 до 122

Нужно чтобы числа рандомились с 97 до 122

Вылетает с ошибкой "прекращена работа программы":

281
Авторизация с помощью angular2

Авторизация с помощью angular2

Имеется простой модуль к доступу к компоненту через AuthGuard

497
Изменить код в теге &lt;script&gt; и выполнить

Изменить код в теге <script> и выполнить

Необходимо программными средствами изменить содержание тега <script>, а затем выполнить новый кодНичего на ум не приходит, как удалить его...

340
Не получается реализовать таймер

Не получается реализовать таймер

Привет всем! Такая проблема, хочу реализовать таймерНо после "time_query" значение не изменяется

252