如何动态创建具有已知第二维的c ++数组?

时间:2016-09-22 11:50:19

标签: c++ arrays multidimensional-array

我有一个功能:

void foo(double[][4]);

采用二维数组,第二维等于4.如何分配二维数组以便将其传递给函数?如果我这样做:

double * arr[4];
arr = new double[n][4];

其中编译器不知道n。我无法编译。如果我使用通用的2d动态数组,函数foo将不会接受它。

4 个答案:

答案 0 :(得分:4)

根据要求,最好使用typedef

 typedef double four[4];
 four *arr;     // equivalently double (*arr)[4];
 arr = new four[n];

如果没有typedef,你会变得更加神秘

double (*arr)[4];
arr = new double [n][4];

您应该考虑使用标准容器(std::vector等)或容器容器。

答案 1 :(得分:2)

<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.css">

    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>
    <script src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/t-114/svg-assets-cache.js"></script>

    <script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.js"></script>

    <script>
        angular.module("elcomaApp", ['ngMaterial', 'ngMessages', 'material.svgAssetsCache'])
            .config(function($mdIconProvider){
                $mdIconProvider.iconSet('mdsize', 'fileSrc.txt', 204);
            })
            .controller("MainController", function() {

            });
    </script>
</head>

<body ng-app="elcomaApp" ng-controller="MainController" ng-cloak>
    <md-icon md-svg-icon="mdsize:A"></md-icon>  
</body>
</html>

考虑切换到数组和向量。

答案 2 :(得分:0)

我知道它可能不是OP打算做的,但它可能会帮助其他需要类似答案的人。

您正在尝试创建一个静态成功数组的动态数组。 STL得到了您的解决方案:std::vectorstd::array

使用这些容器,事情变得容易:

std::vector<std::array<int, 4>> foo;

// Allocate memory
foo.reserve(8);

// Or instead of 8, you can use some runtime value
foo.reserve(someSize);

// Or did not allocated 8 + someSize, but ensured
// that vector has allocated at least someSize

// Add entries
foo.push_back({1, 2, 3, 4});

// Looping
for (auto&& arr : foo) {
    arr[3] = 3;
}

// Access elements
foo[5][2] = 2;

答案 3 :(得分:-2)

除了创建新类型并占用符号之外,您还可以创建指向指针的指针,并按照以下方式执行:

double **arr = new double*[j];
for (int i = 0; i < j; ++i)
{
    arr[i] = new double[4];
}

j是保存动态值的int变量。 我已经编写了一个显示有效的简单代码,请查看here