嵌入式C语言13 二维数组与指针

回顾二维数组:

首先我们先回顾一下不用指针时二维数组的定义和输出:

int a[2][3] ={{1,2,3}, {100, 101, 102}};

int i, j;

printf("%d  %d  %d\n" , sizeof(a) ,sizeof(a[0]) ,sizeof(int));

printf("%p  %p  %p\n" , &a, a ,a[0] );

printf("%p  %p  %p\n" , &a+1, a+1 ,a[0]+1);

for (i = 0 ; i < sizeof(a) /sizeof(a[0]) ; i ++ )

{

    for (j = 0 ; j < sizeof(a[0]) /sizeof(int) ; j ++)

        {

        printf("%d ", a[i][j]);

        }

printf("\n") ;

}

二维数组

在sizeof(a)表示整个数组所占的字节数,共6个int型元素,共占24个字节

sizeof(a[0])表示第一行元素所占的字节数,第一行3个int型元素,共占12个字节。

&a为数组的地址,+1后表示向后移动一个数组的大小,24个字节

a作为地址是表示的是首行地址,+1后向后移动一行,12个字符

a[0]表示首行首元素的地址,+1后向后移动一个元素大小,4个字节。


指针数组与二维数组:提供行数,及每行的首元素地址(名字)。

int *x[2] = {a[0] , a[1]}; 

定义一个名字叫x的数组,它是指针型的包含两个元素,意味着内部两个元素是地址(指针型),两个元素地址分别为a[0], a[1];

int *x[2] = {a[0] , a[1]};

printf("sizeof(x):%d  sizeof(x[0]):%d  sizeof(a[0]):%d  sizeof(int):%d\n" , sizeof(x) ,sizeof(x[0]) ,sizeof(a[0]),sizeof(int));

printf("x:  %p  x[0]  :%p  a[0]  :%p\n" , x ,x[0] ,a[0]);

printf("x+1:%p  x[0]+1:%p  a[0]+1:%p\n" , x+1 ,x[0]+1 ,a[0]+1);

for (i = 0 ; i < sizeof(x) /sizeof(x[0]) ; i ++ )

{

for (j = 0 ; j < sizeof(a[0]) /sizeof(int) ; j ++)

{

printf("%d ", x[i][j]);

}

printf("\n") ;

}

求占据内存大小时:

sizeof(x) :x为一个数组包含两个8字节的指针,所以占据16字节

sizeof(x[0]) :x[0]为x的第一个元素,这个元素是个指针类型(地址a[0]),占据8字节

sizeof(a[0]): a[0]这里不做地址,而作为数组的第一行,共3个int型元素,占据12字节

sizeof(int):4字节的int型

做地址时:

x: 表示数组首元素地址,+1后向后移动8字节

 x[0]:表示首行首元素地址,+1后求变成首行第二个元素的地址,移动4个字节

 a[0] :a[0]作为地址时等于x[0]


数组指针与二维数组:说明列数,并提供首行地址。

int (*y)[3] = a 定义一个数组指针y,指向一个含有3个元素的数组a,也就是二维数组的第一行。所以y也就等于a

*(y+i)表示第i+行 = a[i]  =  y[i]

int (*y)[3] = a ; //y = a

for (i = 0 ; i <2 ; i ++ )

{

    for (j = 0 ; j < 3 ; j ++)

    {

        printf("%d ", y[i][j]);

        printf("%d ", (*(y+i))[j]); //*(y+i) = a[i] 

    }

printf("\n") ;

}



指针与二维数组:当成一个长的一维数组操作。提供首元素地址。

只需要将指针指向第一行的第一个元素即可。

int *p = a[0];

for(i = 0 ; i < 6 ; i ++ )

{

printf("%d " , p[i]);

}

return 0;


你可能感兴趣的:(嵌入式C语言13 二维数组与指针)