-2

我有这个程序

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    int a[][3]={{1,2,3},{4,5,6},{7,8,9}};
    printf("\  Elements of an array with their address\n");
    for(i=0;i<9;i++)
    {
        printf("%8u",&a[0][0]+i);
        printf("[%d]",*(&a[0][0]+i));
        if(i==2 || i==5)
            printf("\n");
    }

}

你能解释一下为什么 (if(i==2 || i==5)使用,我在这一步真的很困惑。提前致谢。

4

2 回答 2

3

该数组是 0 索引的,因此 2 和 5 是每个子数组开始之前的位置,因此它在输出它们之前放置一个换行符。

    {{1,2,3} , {4,5,6} , {7,8,9}};
 i=0--^   ^--i=2    ^--i=5

输出看起来像这样:

数组元素及其地址
3021239472[1]3021239476[2]3021239480[3]
3021239484[4]3021239488[5]3021239492[6]
3021239496[7]3021239500[8]3021239504[9]

请注意,数组的每个维度都有自己的行。

(内存地址可能不同)

于 2013-08-30T18:09:14.260 回答
0

首先,我将尝试向您解释这段代码,因为您必须首先了解程序才能推理特定事物。

这里虽然对于人类来说,数组是 (3 X 3) 的二维矩阵格式,但对于计算机地址,它是连续的内存位置。例如,当它从地址 1000 开始时(虽然最初的实现将具有十六进制地址系统),那么 9 个元素存储在接下来的 36 个字节中,这样每个整数占用 4 个字节。

现在在您的代码中,您通过从第一个地址递增来遍历从 1 到 9 的整数。取而代之的是,您可以使用整数指针。

虽然它在连续的内存空间中,但对于人类来说,我们需要一种矩阵类型的输出,因为在这种表示中,只有我们了解 2D 数组的东西。因此,为此我们需要break-ups在 continuos 数组中。因为这里row size3. 因此,由于索引从零开始,我们break为每三个元素输出一个新行 ('\n') 的格式。

因此在 (0,1, 2 <- Here we have breakup say )
Then 之后(3,4, 5 <- Here too )

于 2013-08-30T18:20:04.610 回答