代码之家  ›  专栏  ›  技术社区  ›  theleos

C: 相同尺寸二维阵列与普通阵列的差异

  •  3
  • theleos  · 技术社区  · 11 年前

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

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

    可以以相同或相似的方式访问这两个二维阵列。我的意思是:它们可以交换吗?我之所以这么问,是因为由于升级,我希望避免对之前编写的所有代码进行重构。

    谢谢。

    3 回复  |  直到 11 年前
        1
  •  3
  •   Tarik    11 年前

    根据 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
  •  1
  •   Community holdenweb    7 年前

    尽管2D阵列可以表示为 1D array (严格来说 behavior is undefined ).

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

    这可能取决于情况。
    通过调用函数可以看到一个简单的区别

    void foo(int *p)  
    {
    
    }
    

    对于这两种情况。这个 first 可以传递给 foo 通过传球 &first[i][j] , *first first[i] (其中 i j int 类型并表示数组绑定内的行和列索引) second 可以作为 第二 &second[i] .
    你不能通过 第一 (与 第二 )以及 second[i] (与 第一[i] )到 足球 作为参数,因为它们与的预期参数不兼容 足球 (属于 int * ).

        3
  •  0
  •   haccks    11 年前
    int first[1][10];
    int second[10];
    

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