【问题标题】:Passing a pointer representing a 2D array to a function in C++将表示二维数组的指针传递给 C++ 中的函数
【发布时间】:2011-07-16 19:00:54
【问题描述】:

http://www.neilstuff.com/guide_to_cpp/notes/Multi%20Dimension%20Arrays%20and%20Pointer%20Pointers.htm

根据这个网站,我应该可以使用以下代码:

double stuff[3][3];
double **p_stuff;
p_stuff = stuff;

但我收到投诉称分配不允许转换。

我做错了吗?

我有一个 extern "C" 类型的函数,我想将这个 double stuff[3][3] 传递给它。所以我想我需要让它成为一个指针,对吧?

【问题讨论】:

  • 不,注释是错误的。 double[3][3] 不能衰减到 double**(它会衰减到 (double*)[3])。
  • 在双 **p_stuff 之后尝试 p_stuff = new double *stuff[3]
  • 这个 C 函数的签名是什么?
  • 已编辑问题以反映我的意图。将这双重内容[3][3] 转换为 C 函数。
  • 我也在写 C 函数……所以我可以随心所欲地制作签名。现在我把它当作 (....., double **p_stuff, ...)

标签: c++ arrays


【解决方案1】:

关于编辑:将此double stuff[3][3] 传递给 C 函数,您可以

1) 传递一个指向整个二维数组的指针:

void dostuff(double (*a)[3][3])
{
// access them as (*a)[0][0] .. (*a)[2][2]
}
int main()
{
    double stuff[3][3];
    double (*p_stuff)[3][3] = &stuff;
    dostuff(p_stuff);
}

2) 传递一个指向第一个一维数组(第一行)的指针和行数

void dostuff(double a[][3], int rows)
{
// access them as a[0][0] .. a[2][2]
}
int main()
{
    double stuff[3][3];
    double (*p_stuff)[3] = stuff;
    dostuff(p_stuff, 3);
}

3) 传递指向第一行中第一个值的指针以及列数和行数

void dostuff(double a[], int rows, int cols)
{
// access them as a[0] .. a[8];
}
int main()
{
    double stuff[3][3];
    double *p_stuff = stuff[0];
    dostuff(p_stuff, 3, 3);
}

(最后一个选项并不严格符合标准,因为它将指向一维数组(第一行)元素的指针前进到该数组的末尾)

如果这不是 C 函数,那么还有更多选择!

【讨论】:

  • +1, 作为对最后一行的一个小扩展,在 C++ 中,您还可以通过引用传递数组,并且可以使用模板使代码与数组大小无关:template <std::size_t N, std::size_t M> void process( double (&a)[N][M] ); if您希望它能够使用不同的尺寸。随意混合和匹配:如果您只想允许平方数组使用单个模板参数。
【解决方案2】:

您的分配有缺陷。 p_stuff; 是指向 double 的指针,而 stuff 是二维数组(数组数组)

一维数组衰减到指向其第一个元素的指针。二维数组衰减为指向一维数组的指针。

试试这个

double stuff[3][3];
double (*p_stuff)[3]; // pointer to array of 3 int
p_stuff = stuff;

【讨论】:

    【解决方案3】:

    double ** p_stuff; 对应于 指向双精度指针的数组double stuff[3][3] 没有任何指针 - 它是一个二维数组。

    【讨论】:

    • 已编辑问题以反映我的意图。将这双重内容[3][3] 转换为 C 函数。
    【解决方案4】:

    下面或许就是你的答案:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef unsigned int uint;
    uint m[10][20];
    uint **ppm;
    
    int main() {
        int i;
    
        ppm = (uint **)m;
        for (i =0; i<10; ++i)ppm[i] = (uint *)&m[i];
    
        m[1][1] = 10;
    
        printf("0x%x vs 0x%x: %d vs %d\n", ppm,m, m[1][1], *(*(ppm+1)+1));
    
        return 0;
    }
    

    结果在控制台屏幕上:

    0x6010a0 vs 0x6010a0: 10 vs 10
    

    【讨论】:

      【解决方案5】:

      除了 Cubbi 的详细回答,下面的方式很自然的将一个 2-dim 数组传递给一个函数:

      void dostuff(void *a1, int rows, int cols)
      {
          double (*a)[cols] = (double (*)[cols]) a1;
          // access them as a[0][0] .. a[rows-1][cols-1];
      }
      int main()
      {
          double stuff[3][3];
          dostuff(stuff, 3, 3);
      }
      

      您不必提前转换它们,因为最新的 C++ (C++14) 支持运行时大小的数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-28
        • 1970-01-01
        • 1970-01-01
        • 2014-05-09
        • 2018-12-08
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        相关资源
        最近更新 更多