将动态数组/矩阵传递给函数进行初始化
Pass dynamic arrays/matrices to functions for initialization
我的问题基本上是这个问题的后续问题 将动态数组传递给其他函数的正确方法。这里询问了将动态数组传递给函数的正确方法。给出了三个选项:
void test(bool arr[])
void test(bool *arr)
void test(bool *&arr)
前两个按值传递指针(数组(,第二个通过引用传递指针。所有这些都可以用来改变数组的内容,如 alestanis 的答案所示。
现在我的问题是,如果要在函数内动态分配数组,正确的方法是什么。所以像这样:
void init(double ?arr?, int n){
arr = new double[n];
}
void main(){
double * array;
init(array,15);
}
我相信它仅适用于最后一种语法,但我不确定。
此外,我想知道如果你有一个矩阵,最后一个语法会是什么样子。你会有两个&
吗?还是不可能?
附言我有不同的大向量和矩阵,所以我宁愿使用常规数组而不是 std 的东西。向量和矩阵的大小是用户的输入值,向量和矩阵仅在输入完成后创建,因此我永远不需要调整向量/矩阵的大小。
如果要按值传递指针,则它对指针与函数的更改不会影响原始参数。该函数将处理原始指针值的副本。
所以你有两种方法。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++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 我们是否需要为 C++ 中的多个函数初始化多个模板?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 如何从静态类函数初始化静态类对象
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 使用 c++ 中的函数初始化数组
- 使用 lambda 函数初始化静态数据成员