C_多维数组和指针

C_多维数组和指针

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。

先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例 :

定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为2000

则有……

第一行地址a[0] 2000 a[0][0] 2004 a[0][1] 2008 a[0][2] 2012 a[0][3]
存放数据 1 3 5 7
第二行地址a[1] 2016 a[1][0] 2020 a[1][1] 2024 a[1][2] 2028 a[1][3]
存放数据 9 11 13 15
第三行地址a[2] 2032 a[2][0] 2036 a[2][1] 2040 a[2][2] 2044 a[2][3]
存放数据 17 19 21 23
表 示 形 式 含义 地 址
a 二维数组名,指向一维数组a[0],即0行首地址 2000
a[0], *(a+0), *a 0行0列元素地址 2000
a+1,&a[1] 1行首地址 2016
a[1],*(a+1) 1行0列元素a[1][0]的地址 2016
a[1]+2, *(a+1)+2, &a[1][2] 1行2列元素a[1][2] 的地址 2024
*(a[1]+2), *(*(a+1)+2), a[1][2] 1行2列元素a[1][2]的值 元素值为13
/**
* 一维数组里面存放的是二维数组的地址
* 二维数组才是真正存放的是数值
*/
a[i][j] = *(*(a+i)+j)
a[i][j]...[z]=*(*(...*(a+i)+j)...+z)
#include <stdio.h>

void main()
{
    int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

    printf("a: %d\n", a);

    printf("*a: %d\n", *a);

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

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

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

    printf("a+1: %d\n", a+1);

    printf("*(a+1): %d\n", *(a+1));

    printf("a[1]: %d\n", a[1]);

    printf("&a[1]: %d\n", &a[1]);

    printf("&a[1][0]: %d\n", &a[1][0]);

    printf("a+2: %d\n", a+2);

    printf("*(a+2): %d\n", *(a+2));

    printf("a[2]: %d\n", a[2]);

    printf("&a[2]: %d\n", &a[2]);

    printf("&a[2][0]: %d\n", &a[2][0]);

    printf("a[1]+1: %d\n", a[1]+1);

    printf("*(a+1)+1: %d\n", *(a+1)+1);

    printf("*(a[1]+1): %d\n", *(a[1]+1));

    printf("*(*(a+1)+1): %d\n", *(*(a+1)+1));

}

指向多维数组元素的指针变量

把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为:

​ int (*p)[4]

它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],&a[0][0]‘等。而p+i则指向一维数组a[i]。

二维数组的指针变量说明的一般形式为:

类型说明符 (*指针变量名)[长度]

其中“类型说明符”为所指数组的数据类型*表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。

用指针输出二维数组的数值

#include <stdio.h>

void main()
{

    int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

    int (*p)[4];

    int i, j;

    p = a;

    for( i=0; i < 3; i++)
    {
          for( j=0; j < 4; j++) 
          {
                printf("%2d  ", *(*(p+i)+j));

          }
          printf("\n");
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40304387/article/details/80429981
今日推荐