指针系统学习3-多维数组与指针

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。

先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例 :定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为2000,则有……

内存中数据存放图示:

 

 

 

源码分析:输出二维数组有关的值

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

}

结果:

 1 a: 2686736
 2 *a: 2686736
 3 a[0]: 2686736
 4 &a[0]: 2686736
 5 &a[0][0]: 2686736
 6 a+1: 2686752
 7 *(a+1): 2686752
 8 a[1]: 2686752
 9 &a[1]: 2686752
10 &a[1][0]: 2686752
11 a+2: 2686768
12 *(a+2): 2686768
13 a[2]: 2686768
14 &a[2]: 2686768
15 &a[2][0]: 2686768
16 a[1]+1: 2686756
17 *(a+1)+1: 2686756
18 *(a[1]+1): 5
19 *(*(a+1)+1): 5
20 请按任意键继续. . .
View Code

 

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

  把二维数组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]。
  从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。
  二维数组指针变量说明的一般形式为:类型说明符  (*指针变量名)[长度]
  其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。

实战演练:
用指针变量输出二维数组元素的值

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

 

例题:通过输入指定行数和列数打印出二维数组对应任一行任一列元素的值。

#include <stdio.h>

void  main ( )
{
      int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
      int (*p)[4], i, j;
   
      p = a;
      
      printf("i = ");
      scanf("%d", &i);
      while( i > 2 || i < 0 )
      {
            printf("i = ");
            scanf("%d", &i);
      }
      printf("j = ");
      scanf("%d", &j);
      while( j > 3 || j < 0 )
      {
            printf("j = ");
            scanf("%d", &j);
      }

      printf("a[%d, %d] = %d\n", i, j, *(*(p+i)+j));

}
View Code

 

 

 

 




 

posted @ 2018-11-30 17:18  耐烦不急  阅读(364)  评论(0编辑  收藏  举报