• 指针系统学习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
    ", a);
    
        printf("*a: %d
    ", *a);
    
        printf("a[0]: %d
    ", a[0]);
    
        printf("&a[0]: %d
    ", &a[0]);
    
        printf("&a[0][0]: %d
    ", &a[0][0]);
    
        printf("a+1: %d
    ", a+1);
    
        printf("*(a+1): %d
    ", *(a+1));
    
        printf("a[1]: %d
    ", a[1]);
    
        printf("&a[1]: %d
    ", &a[1]);
    
        printf("&a[1][0]: %d
    ", &a[1][0]);
    
        printf("a+2: %d
    ", a+2);
    
        printf("*(a+2): %d
    ", *(a+2));
    
        printf("a[2]: %d
    ", a[2]);
    
        printf("&a[2]: %d
    ", &a[2]);
    
        printf("&a[2][0]: %d
    ", &a[2][0]);
    
        printf("a[1]+1: %d
    ", a[1]+1);
    
        printf("*(a+1)+1: %d
    ", *(a+1)+1);
    
        printf("*(a[1]+1): %d
    ", *(a[1]+1));
    
        printf("*(*(a+1)+1): %d
    ", *(*(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("
    ");
        }
    }

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

    #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
    ", i, j, *(*(p+i)+j));
    
    }
    View Code




  • 相关阅读:
    减治算法之寻找第K小元素问题
    OpenGL的版本号历史和发展
    动态注冊监听
    Thinking in Java -- 类型信息RTTI
    Unity3D
    Oracle改动字段类型
    函数定义
    foreach
    数组
    结构体
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/10045402.html
Copyright © 2020-2023  润新知