1

正如您可以检查此代码:

#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 个循环和变量来打印它,但我正在尝试学习如何以这种方式进行打印。

4

3 回答 3

3

在这两种情况下,您正在做的事情都是不好的做法。您很幸运,第一种方法有效(因为 3 个大小为 4 的子数组在内存中是连续的)。

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

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('除法后的余数')。

于 2013-08-14T13:09:11.890 回答
0

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

多维数组如何在内存中格式化?

于 2013-08-14T13:13:39.953 回答
-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 中,二维数组总是只是将两个一维放在一起。但是,请参阅我的反对票,使用它并不好。

如果你真的需要速度,你不想要/and '%' 我认为你仍然可以使用 cide 1th。

于 2013-08-14T13:28:08.817 回答