Если вы передадите указатель по значению, то его изменение указателя с помощью функции не повлияет на исходный аргумент. Функция будет иметь дело с копией значения исходного указателя.
Итак, у вас есть два подхода. Подход C ++ -
void test(bool *&arr);
Подход C -
void test(bool **arr)
Вот демонстрационная программа.
#include <iostream>
#include <iterator>
#include <numeric>
void init( double * &a, size_t n )
{
a = new double[n];
std::iota( a, a + n, 0.0 );
}
void init( double **a, size_t n )
{
*a = new double[n];
std::iota( std::reverse_iterator<double *>( *a + n ), std::reverse_iterator<double *>( *a ), 0.0 );
}
int main()
{
size_t n = 10;
double *a = nullptr;
init( a, n );
for ( const double *p = a; p != a + n; ++p )
{
std::cout << *p << ' ';
}
std::cout << '\n';
delete []a;
a = nullptr;
init( &a, n );
for ( const double *p = a; p != a + n; ++p )
{
std::cout << *p << ' ';
}
std::cout << '\n';
delete []a;
a = nullptr;
return 0;
}
Его вывод
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
Если вы хотите динамически выделить двумерный массив с фиксированным числом столбцов, то, например, объявления функций могут выглядеть следующим образом.
#include <iostream>
#include <iterator>
#include <numeric>
const size_t N = 5;
void init( double ( * &a )[N], size_t n )
{
a = new double[n][N];
for ( size_t i = 0; i < n; i++ )
{
std::iota( std::begin( a[i] ), std::end( a[i] ), i + i / 10.0 );
}
}
void init( double ( **a )[N], size_t n )
{
*a = new double[n][N];
for ( size_t i = 0; i < n; i++ )
{
std::iota( std::begin( ( *a )[i] ), std::end( ( *a )[i] ), i + i / 10.0 );
}
}
int main()
{
double ( *a )[N] = nullptr;
init( a, N );
for ( size_t i = 0; i < N; i++ )
{
for ( const auto &item : a[i] )
{
std::cout << item << ' ';
}
std::cout << '\n';
}
std::cout << '\n';
delete []a;
a = nullptr;
init( a, N );
for ( size_t i = 0; i < N; i++ )
{
for ( const auto &item : a[i] )
{
std::cout << item << ' ';
}
std::cout << '\n';
}
std::cout << '\n';
delete []a;
a = nullptr;
return 0;
}
Выходные данные программы:
0 1 2 3 4
1.1 2.1 3.1 4.1 5.1
2.2 3.2 4.2 5.2 6.2
3.3 4.3 5.3 6.3 7.3
4.4 5.4 6.4 7.4 8.4
0 1 2 3 4
1.1 2.1 3.1 4.1 5.1
2.2 3.2 4.2 5.2 6.2
3.3 4.3 5.3 6.3 7.3
4.4 5.4 6.4 7.4 8.4