我在C++中使用3D数组的指针时遇到了一些困难。我有一个Q[3][N][N]
的数组,我想将其传递给一个函数,以打印[0][i][j]
位置的值(以及[1][i][j]
和[2][i][j]).
的值)。我如何实现这一点?使用Q[i][j][0]
等会更方便吗?
对于2D,当我给出&Q[0][0]到*var:
template <typename T>
void print2d(T *var, int I, int J){
cout << endl;
for (int j = 0; j < J; j++){
for (int i = 0; i < I; i++){
cout << setprecision(3) << setw(12) << *(var + (N*i + j));
}
cout << endl;
}
cout << endl;
}
我用同样的方法为3D编写了一个类似的函数,但没有写出正确的值:有人能告诉我指向Q[i][j][1]
正确地址的正确方法吗。在输入参数中,我给出了Q[0][0][0]的地址。如果我想为k的特定值写出来,我应该使用不同的地址(比如Q[I][j][1])吗?
template <typename T>
void print3d(T *var, int I, int J, int K){
cout << endl;
for (int j = 0; j < J; j++){
for (int i = 0; i < I; i++){
cout << setprecision(3) << setw(12) << *(var + I*J*i + I*j + K);
}
cout << endl;
}
cout << endl;
}
例如,N必须是常量。但考虑使用向量。
#include <stdio.h>
#include <iostream>
using namespace std;
const int N = 5;
void func2(int* tab, int A, int B, int C)
{
printf("%dn", tab[N*N*A + N*B + C] );
}
void func(int tab[3][N][N])
{
for (int i = 0; i < 3; ++i)
for (int j = 0; j < N; ++j, printf("n"))
for (int k = 0; k < N; ++k)
{
printf("%d ", tab[i][j][k]);
}
}
int main()
{
int tab[3][N][N];
int p = 0;
for (int i = 0; i < 3; ++i)
for (int j = 0; j < N; ++j)
for (int k = 0; k < N; ++k)
{
tab[i][j][k] = p++;
}
func(tab);
printf("n");
func2((int*)tab, 1, 1, 3);
}
我同意Adam的回答,但不能发表评论,需要更多的分数。
1) 数组不是指针。多维数组不能通过指针传递,需要具有除一个维度外的所有维度常量。以下是一个有助于理解的答案。
无法将数组强制转换为指针
如何将对二维数组的引用传递给函数?
http://www.cplusplus.com/forum/articles/17108/
您可能需要尝试STL中的矢量。
2) 模板只有在使用了它的实例时才会编译,这就是为什么它的声明和用法通常放在一个文件中的原因。模板编译