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)
作为条件。