请查看以下代码:
#include <iostream>
using namespace std;
int main(){
char matrix[2][2][2];
return 0;
}
int getMatrixData(char matrix[][2][2], int x, int y, int z) {
return matrix[x][y][z];
}
当矩阵3d数组作为参数传入函数时,为什么不指定第一个[]大小?如何解释这个缺失的维度?
答案 0 :(得分:4)
您的代码在语法上是不正确的。假设你的意思是int getMatrixData(char matrix[][2][2], int x, int y, int z)
。
将数组参数传递给函数时,array decays to pointer传递给第一个元素(在本例中为char [2][2]
类型)。
现在一些数组和指针的语法是相似的,所以你找不到太大的区别。
当传递多维数组时,例如在您的情况下为3d,它可以被视为二维数组的数组。因此,您需要在您的情况下给出每个元素char [2][2]
的类型,并且您可以跳过最终数组的维度,因为它无论如何都会衰减到指针。 char [2][2]
是编译器需要计算每个元素的偏移量的信息。
offset of matrix[x][y][z] = base address of matrix +
x * sizeof(char [2][2]) +
y * sizeof(char [2]) +
z
如果未传递initial元素的维度,则编译器无法解析上述等式中的sizeof
。传递跳过的维度是可选的。
答案 1 :(得分:0)
在c ++中,我会以不同的方式使用多维数组。互联网上有很多关于它的主题。
This topic解释了如何使用char***
来完成此操作。 E.g:
char getMatrixData(char*** matrix, int x, int y, int z)
{
return matrix[x][y][z];
}
int main()
{
char ***matrix = new char**[2];
for (auto i = 0; i < 2; i++)
{
matrix[i] = new char*[2];
for (auto j = 0; j < 2; j++)
{
matrix[i][j] = new char[2];
}
}
getMatrixData(matrix, 1, 1, 1);
// N.B.! you should normally free the memory using delete []!!
// But in this case the program ends, so the memory is freed anyhow.
return 0;
}
但你也可以使用std :: vector type
#include <vector>
using std::vector;
using CharVector1D = vector<char>;
using CharVector2D = vector<CharVector1D>;
using CharVector3D = vector<CharVector2D>;
char getMatrixData(CharVector3D const& matrix, int x, int y, int z)
{
return matrix[x][y][z];
}
int main()
{
CharVector3D matrix(2, CharVector2D(2, CharVector1D(2)));
getMatrixData(matrix, 1, 1, 1);
return 0;
}
但是,c ++应该是一种面向对象的编程语言。因此,定义矩阵对象可能更好。
#include <vector>
using std::vector;
template <class T>
class Matrix3D
{
private:
size_t _sizeX;
size_t _sizeY;
size_t _sizeZ;
vector<T> _data;
public:
Matrix3D(size_t const x_size, size_t const y_size, size_t const z_size)
: _sizeX(x_size)
, _sizeY(y_size)
, _sizeZ(z_size)
, _data(vector<T> (x_size*y_size*z_size))
{}
T GetData(size_t const x, size_t const y, size_t const z) const
{
return _data.at(x + (_sizeX * (y + (_sizeY * z))));
}
};
int main()
{
Matrix3D<char> matrix(2, 2, 2);
matrix.GetData(1, 1, 1);
return 0;
}