【问题标题】:How to work with 3d arrays through pointers in C++如何通过 C++ 中的指针处理 3d 数组
【发布时间】:2014-04-09 22:06:57
【问题描述】:

我在使用 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;
}

【问题讨论】:

  • “困难”究竟是什么?我们无法帮助解决没有信息的问题。
  • 我想为特定的 i(或 k)写 Q[i][j][k]。
  • N 编译时间是否固定?
  • 是的,我已将 N 设置为全局变量,因为它在整个程序中都不会改变。
  • @pranav 全局变量?它需要是一个完整的时间常数。即使你不改变它,变量也不会起作用。

标签: c++ pointers multidimensional-array


【解决方案1】:

示例,N 必须是 const。 但考虑使用矢量。

#include <stdio.h>
#include <iostream>
using namespace std;
const int N = 5;

void func2(int* tab, int A, int B, int C)
{
    printf("%d\n", 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);
}

【讨论】:

  • func 可以在不同的文件中吗?我猜你正在传递一个完整的数组,对吧?我怎样才能用指针实现这一点?
  • 我更新了示例。 func2 不是那么漂亮,它假设 tab 在连续的内存块中。 (在指针中,数组是动态分配的,这是不正确的)
  • 本例中,func的数组维度可以使用模板参数代替N,这样可以支持不同大小的数组。
【解决方案2】:

我同意亚当的回答,但不能发表评论,需要更多点。

1) 数组不是指针。多维数组不能通过指针传递,需要除一维常量外的所有数组。这是一个帮助理解的答案。

Cannot cast array to pointer

How do I pass a reference to a two-dimensional array to a function?

http://www.cplusplus.com/forum/articles/17108/

您可能想尝试使用 STL 中的向量。

2) 模板只有在使用它的实例时才会编译,这就是为什么它的声明和使用通常放在一个文件中的原因。 Template Compilation

【讨论】:

  • 我同意向量可能比数组更方便使用,但是我的程序需要大量计算(matlab 中的类似程序需要大约 6 小时)。我读到向量的便利是以性能为代价的,我想避免这种情况。如果我错了,请告诉我。
  • 向量的向量不使用连续存储,因此它可能不适合作为多维数组的替代品。但是,无论如何使用一维数组并计算其中的偏移量以找到您想要的元素,这不是句法戏剧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
相关资源
最近更新 更多