c++ - 将动态数组/矩阵传递给函数进行初始化

标签 c++ arrays dynamic

我的问题基本上是这个问题的后续问题Proper way to pass dynamic arrays to other functions .这里询问将动态数组传递给函数的正确方法。给出了三个选项:

void test(bool arr[])
void test(bool *arr)
void test(bool *&arr)

前两个按值传递指针(数组的),第二个按引用传递指针。 All 可用于更改数组的内容,如 alestanis 的回答所示。

现在我的问题是,如果您想在函数内动态分配数组,正确的方法是什么。所以像这样:

void init(double ?arr?, int n){
    arr = new double[n];
}

void main(){
    double * array;
    init(array,15);
}

我相信它只适用于最后一种语法,但我不确定。

此外,我想知道如果你有一个矩阵,最后的语法会是什么样子。你有两个 & 吗?还是根本不可能?

附言我有不同的大 vector 和矩阵,所以我宁愿使用常规数组而不是 std 东西。 vector 和矩阵的大小是用户的输入值, vector 和矩阵仅在输入完成后创建,因此我永远不需要调整 vector/矩阵的大小。

最佳答案

如果您将按值传递指针,那么指针随函数的变化不会影响原始参数。该函数将处理原始指针值的拷贝。

所以你有两种方法。 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

关于c++ - 将动态数组/矩阵传递给函数进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58171765/

相关文章:

php - 从 $.post() 获取数组

c++ - 如何使表格的列可编辑?

C++11 原子 : why does this code work?

c++ - 如何使用常量引用访问 vector<int*> 的元素?

php - 在数组中使用随机变量

arrays - 计算列表中 k 个最大数字之和的有效方法?

dynamic - groovy 中带有表达式的 ODI 自动映射

c# - dynamic 关键字是否*仅*用于动态语言?

C++:有 unicode 控制台标题..?

javascript - typescript 动态和安全地将元素添加到数组