C:具有相同大小的二维数组和普通数组之间的差异

时间:2013-10-22 09:54:45

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

我想知道,鉴于下面的声明:

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

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

非常感谢。

3 个答案:

答案 0 :(得分:3)

根据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;
}

答案 1 :(得分:1)

2D阵列和相同大小的1D阵列不相同/相似,尽管2D阵列可以表示为1D array(严格来说是behavior is undefined)。

  

我的意思是:他们可以互换吗?

可能取决于具体情况 通过调用函数

可以看到一个简单的区别
void foo(int *p)  
{

}

两个案例。通过传递firstfoo&first[i][j](其中*firstfirst[i]为{i},j可以传递给int {1}}类型并表示数组边界内的行和列索引)而数组second可以作为second&second[i]传递。
您不能将first(与second不同)和second[i](与first[i]不同)作为参数传递给foo,因为它们与预期的参数不相容fooint *)。

答案 2 :(得分:0)

int first[1][10];
int second[10];

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