【问题标题】:C: differences between two-dimensional array and normal array with same sizeC:相同大小的二维数组和普通数组的区别
【发布时间】:2013-10-31 03:03:18
【问题描述】:

鉴于以下声明,我想知道是否:

int first[1][COLUMN_NUMBER];
int second[COLUMN_NUMBER];

可以以相同或相似的方式访问两个二维数组。我的意思是:它们可以交换吗?我问这个是因为,由于升级,我想避免重构我之前写的所有代码。

非常感谢。

【问题讨论】:

  • @user1770426;提供的链接与此问题有何关联?

标签: c arrays multidimensional-array size memory-address


【解决方案1】:

根据this piece of code,应该没有区别。

#include <stdio.h>

int main(void) {
    int const COLUMN_NUMBER = 10;
    union {
      int first[1][COLUMN_NUMBER];
      int second[COLUMN_NUMBER];
      } u;
    u.first[0][5] = 3;
    printf("%d\n", u.second[5]);
    return 0;
}

【讨论】:

    【解决方案2】:

    虽然二维数组可以表示为1D array(严格来说是behavior is undefined),但相同大小的二维数组和一维数组并不相同/相似。

    我的意思是:它们可以交换吗?

    视情况而定。
    通过调用函数可以看到一个简单的区别

    void foo(int *p)  
    {
    
    }
    

    对于这两种情况。 first 可以通过 &amp;first[i][j]*firstfirst[i] 传递给 foo(其中 ijint 类型并表示数组绑定内的行和列索引)而数组second 可以作为second&amp;second[i] 传递。
    您不能将first(不像second)和second[i](不像first[i])作为参数传递给foo,因为它们与fooint *)的预期参数不兼容)。

    【讨论】:

      【解决方案3】:
      int first[1][10];
      int second[10];
      

      对于此示例,这两个语句在内存分配方面没有区别。第一条语句声明了一个 1 行 10 列的数组。类似地,第二条语句创建了一个只有 10 个元素的数组。从逻辑上讲,两个语句不同,但这里都占用相同的内存空间。 在第一个语句的情况下,如果我们有 int first[10][10] 那么它将声明一个 10 行和 10 列的数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 2021-10-07
        相关资源
        最近更新 更多