如何在C++中通过指针处理3d数组

How to work with 3d arrays through pointers in C++

本文关键字:指针 处理 3d 数组 C++      更新时间:2023-10-16

我在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) 模板只有在使用了它的实例时才会编译,这就是为什么它的声明和用法通常放在一个文件中的原因。模板编译