Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中多维数组中指针的使用_C - Fatal编程技术网

C语言中多维数组中指针的使用

C语言中多维数组中指针的使用,c,C,我有这个节目 #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

我有这个节目

#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");
    }

}
#包括
#包括
int main()
{
int i;
int a[][3]={{1,2,3},{4,5,6},{7,8,9};
printf(“\数组元素及其地址\n”);

对于(i=0;i数组是0索引的,因此2和5是每个子数组开始之前的点,因此它在输出它们之前放置一个换行符

    {{1,2,3} , {4,5,6} , {7,8,9}};
 i=0--^   ^--i=2    ^--i=5
输出如下所示:

Elements of an array with their address 3021239472[1]3021239476[2]3021239480[3] 3021239484[4]3021239488[5]3021239492[6] 3021239496[7]3021239500[8]3021239504[9] 数组的元素及其地址 3021239472[1]3021239476[2]3021239480[3] 3021239484[4]3021239488[5]3021239492[6] 3021239496[7]3021239500[8]3021239504[9] 请注意,数组的每个维度都有自己的线


(内存地址可能会有所不同)

首先,我会尝试向您解释这段代码,因为您必须首先理解程序才能解释特定的事情

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

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

虽然它是在连续的内存空间中,但对于人类来说,我们需要一种矩阵形式的输出,因为在这种表示中,只有我们理解了2D数组的内容。因此,我们需要在continuos数组中进行
分解
。这里的
行大小
3
。因此,由于索引从零开始,我们
分解
o每三个元素以新行('\n')输出格式


因此,在
(0,1,2)之后,
printf(“\n”)
只是给你一个漂亮的3x3输出。通过一点检查或运行程序就可以很容易地验证。:)如果这是你唯一的问题,那么你文章的标题就有点不对劲了。如果(i%3==2)printf(\n”)
(或
putchar),可能会更清楚('\n');
)。同样,将2D数组视为1D数组很有可能工作,但严格来说,这是一种未定义的行为。但这不是您所问的,因此,
%8u
也不是打印地址的正确格式。
printf(“%8u”、&a[0][0]+i);
应该是
printf(“%p”、(void*)&a[0][0]+i)
--尽管这可能不会很好地对齐列,因为
%p
的输出是实现定义的。最好在末尾有一个换行符,因此将
| i==8
添加到条件中会很好,或者使用
if(i%3==2)
作为条件。