打印二维数组内容的不同方法

时间:2013-08-14 13:02:40

标签: c arrays loops

您可以查看此代码:

#include<stdio.h>

int main(){
    int a[3][4];
    int i;
    for(i=0;i<12;i++){
        a[0][i]=12-i;
        printf("a[0][%i] = %i\n", i, a[0][i]);
    }
    return 0;
}

它正确地打印从12到1的数字。但是这段代码:

#include<stdio.h>

int main(){
    int a[3][4];
    int i;
    for(i=0;i<12;i++){
        a[i][0]=12-i;
        printf("a[%i][0] = %i\n", i, a[i][0]);
    }
    return 0;
}

它打印12,11,10,1,2,1。可能是什么问题?我知道你可以使用2个循环和变量来打印它,但我正在尝试学习如何这样做。

3 个答案:

答案 0 :(得分:3)

在这两种情况下,你在做什么都是不好的做法。你很幸运,第一种方式可行(因为大小为4的3个子阵列在内存中是连续的)。

如果你想在一维循环中使用二维数组,你应该使用两种整数除法:/%

int main(){
    int a[3][4];
    int i;
    for(i=0;i<12;i++){
        a[i/4][i%4]=12-i;
        printf("a[%i][%i] = %i\n", i/4, i%4, a[i/4][i%4]);
    }
    return 0;
}

例如,对于i = 7,我们有i/4 == 1('划分并向下舍入到整数')和i%4 == 3('除法后的余数')。

答案 1 :(得分:0)

它与数据存储在内存中的方式有​​关。在第一种情况下,您按顺序添加它们,它有3 * 4 = 12个元素的空间。因此,您可以幸运地将所有元素放入其中,因为您完全拥有3 * 4个单元格。在第二种情况下,您试图仅将数据放在每一行的第一个单元格上,但是您没有指示空间为12,表示有3行。 有关多维数组中内存的更多信息,请查看此处:

How are multi-dimensional arrays formatted in memory?

答案 2 :(得分:-1)

+---------------------------------------------------------------------------------+
|    a[0][0]      <--a[0][1]         <--a[0][0]                                   |
|    a[0][1]      <--a[0][2]                                                      |
|    a[0][2]      <--a[0][3]                                                      |
|    a[0][3]            .                                                         |
|    a[1][0]            .            <--a[1][0]                                   |
|    a[1][1]            .                                                         |
|    a[1][2]            .                                                         |
|    a[1][3]            .                                                         |
|    a[2][0]            .            <--a[2][0]                                   |
|    a[2][1]            .                                                         |
|    a[2][2]      <--a[0][10]                                                     |
|    a[2][3]      <--a[0][11]                                                     |
|       ^               ^            <--a[3][0]  <-- already memory overflow !    |
|       |               |                .                                        |
|  array memory     Y 1th code           .                                        |
|                                  others all memory overflow!                  |
|                                                                                 |
|                                      you 2th code                               |
+---------------------------------------------------------------------------------+

因此,您可以使用a[i/4][i%4]确保没有内存溢出。

让我说:当然你的第一个代码是正确的,我不认为这是运气。在C中,二维数组总是只放两个一维的聚集。但是,请参阅我的downvote,使用它并不好。

如果你真的需要速度,你不想要/和&#39;%&#39;我想你仍然可以使用cide 1。