【问题标题】:Please help with passing multidimensional arrays请帮助传递多维数组
【发布时间】:2011-02-04 08:22:36
【问题描述】:

我正在编写一个简单的测试程序来传递多维数组。我一直在努力获取被调用函数的签名。

我的代码:

void p(int (*s)[100], int n) { ... }

...

{
  int s1[10][100], s2[10][1000];
  p(s1, 100);
}

此代码似乎有效,但不是我想要的。我希望函数 p 忽略值的范围是 100 还是 1000,但应该知道有 10 个指针(通过使用函数签名)。

作为第一次尝试:

void p(int (*s)[10], int n) // n = # elements in the range of the array

然后:

void p(int **s, int n) // n = # of elements in the range of the array

但我似乎无法让这些正常工作。我不想对签名中的 100 或 1000 进行硬编码,而是将其传递进去,记住总会有 10 个数组。

显然,我想避免声明函数:

void p(int *s1, int *s2, int *s3, ..., int *s10, int n) 

仅供参考,我正在查看a similar question 的答案,但仍然感到困惑。

【问题讨论】:

    标签: c arrays types multidimensional-array arguments


    【解决方案1】:

    您需要转置数组才能使其正常工作。声明

    int s1[100][10];
    int s2[1000][10];
    

    现在,您可以将这些传递给这样的函数:

    void foo(int (*s)[10], int n) {
        /* various declarations */
        for (i = 0; i < n; i++)
            for (j = 0; j < 10; j++)
                s[i][j] += 1
    }
    

    由于 C 类型系统的工作方式,数组参数只能在您想要的最左侧索引的意义上“灵活”。

    【讨论】:

    • 或者,void p(int s[][10], int n)
    • @outis:非常正确。我使用int (*s)[10] 部分是因为我在模仿原始问题,还因为我个人倾向于避免像int s[][10] 这样的参数声明,因为它们会误导读者了解实际传递给函数的内容。
    • 谢谢戴尔。这看起来是执行我最初想要的正确方法。唯一的问题是转置的结构阻碍了我的代码。似乎另一个建议动态构造多维数组并在范围内传递的答案会更适合和更清晰地理解。
    • 不客气。如果转置的数组让你的代码太笨拙,那么肯定值得尝试@shakov 描述的想法。
    【解决方案2】:

    您还可以为矩阵创建一个struct 并将其传递给函数p

    struct Matrix{
         int **array;
         int n;
         int m;
    };
    
    
    void p(Matrix *k){
         length=k->m;
         width=k->n;
         firstElement=k->array[0][0];
    }
    

    【讨论】:

    • 这种方法有效并且更通用,因为它允许数组的两个维度都具有灵活性。但是,必须明确array 是一个由n 指向整数的指针组成的数组,每个指针都指向一个由m 整数组成的数组。尽管语法相似,但这与一些常量 N 和 M 的简单声明 int array[N][M] 非常不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多