• 指向二维数组元素的指针变量


      (1)指向数组元素的指针变量

      例1.有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值.

      编写程序

     1 #include <stdio.h>
     2 int main()
     3 {
     4     int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
     5     int *p;
     6     for (p = a[0]; p < a[0] + 12; p++)   //a[0]代表列指针的起点,p依次指向下一个元素
     7     {
     8         if ((p - a[0])%4 == 0)
     9         {
    10             printf("
    ");            //%4 ==0,先换行再输出元素
    11         }
    12         printf("%4d  ", *p);
    13 
    14     }
    15     return 0;
    16 }

      本例是顺序输出数组中各元素之值.若要输出指定的某个数值元素(如a[2][3]),可以通过相对位置来计算.a[i][j]在数组中的相对位置的计算公式为i*m+j.所以a[2][3]的地址是(p+2*4+3),即(p+11).

      (2)指向由m个元素组成的一维数组的指针变量

      上例中p是int * p,指向整形数据,p+1所指元素是p所指列元素的下一个元素.

      可以改用另一种方法,使p指向一个包含m个元素的一维数组.这时,如果p先指向a[0](即p=&a[0]),则p+1指向a[1],p的增值以一维数组的长度为单位.如下图

          

      例2. 输出二维数组任一行任一列元素的值.

     1 #include <stdio.h>
     2 int main()
     3 {
     4     int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
     5     int(*p)[4], i, j;
     6     p = a;        //p指向二维数组的0行
     7     printf("please enter row and colum:");
     8     scanf_s("%d,%d", &i, &j);    //2个%d之间的分隔符要和输入时的保持一致
     9     printf("a[%d][%d] = %d",i, j, *(*(p + i) + j));
    10     return 0;
    11 }

        程序分析:程序第5行中的int(*p)[4]表示定义p为一个指针变量,它指向包含4个整型元素的一维数组.注意*p两侧的括号不可缺少,如写成*p[4],则代表指针数组.

      对(*p)[4]的理解,可以做出下面的比较:

      ①int a[4];(a有4个元素,每个元素为整型)

      ②int (*p)[4];(可理解为*p是int[4]类型,指向含有4个元素的数组的指针)

      第②种形式表示 (*p)有4个元素,每个元素为整型.也就是p所指向的对象是有4个整型元素的数组,即p是指向一维数组的指针.p的值是该一维数组的起始地址.

      注意p的类型是int (*)[4],p指向的一维数组的长度是16字节,所以p每增加1,地址就增加16字节.

      

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    【JVM基础】JVM垃圾回收机制算法
    【java基础】- java双亲委派机制
    Java基础(一)
    JVM
    冷知识: 不会出现OutOfMemoryError的内存区域
    疯狂Java:突破程序员基本功的16课-李刚编著 学习笔记(未完待续)
    nor flash之写保护
    spinor/spinand flash之高频通信延迟采样
    nor flash之频率限制
    使用littlefs-fuse在PC端调试littlefs文件系统
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/7380755.html
Copyright © 2020-2023  润新知