• 指针相关


    1、对形式参量使用 const

    函数之所以可以改变数组的内容,是因为函数使用了指针,从而能够直接使用原始数据。

    使用 const 并不要求原始数据是固定不变的;只是说明函数在处理const所定义数组时,应把数组当做是固定不变的。

      如果函数想修改数组,那么在声明参量时就不要使用 const ;如果函数不需要修改数组,那么在声明数组参量时最好使用const 。

    2.指针与多维数组

    2.1 指针与多维数组

      zippo[m][n] == *(*(zippo + m) + n) 

    #include <stdio.h>
    int main(void)
    {
        int zippo[4][2] = { {2,4}, {6,8}, {1,3}, {5, 7} };
       
        printf("   zippo = %p,    zippo + 1 = %p ",
                   zippo,         zippo + 1);
        printf("zippo[0] = %p, zippo[0] + 1 = %p ",
                zippo[0],      zippo[0] + 1);
        printf("  *zippo = %p,   *zippo + 1 = %p ",
                  *zippo,        *zippo + 1);
        printf("zippo[0][0] = %d ", zippo[0][0]);
        printf("  *zippo[0] = %d ", *zippo[0]);
        printf("    **zippo = %d ", **zippo);
        printf("      zippo[2][1] = %d ", zippo[2][1]);
        printf("*(*(zippo+2) + 1) = %d ", *(*(zippo+2) + 1));
     
        return 0;
    }
    运算结果:
    zippo=0x7fff5fbff8a0, zippo+1=0x7fff5fbff8a8
      zippo[0]=0x7fff5fbff8a0, zippo[0]+1=0x7fff5fbff8a4
     *zippo=0x7fff5fbff8a0, *zippo+1=0x7fff5fbff8a4

    zippo[0][0] = 2
      *zippo[0] = 2
        **zippo = 2

          zippo[2][1] = 3
    *(*(zippo+2) + 1) = 3
     
    输出显示出二维数组 zippo 的地址和一维数组 zippo[0] 的地址是相同的,均为相应的数组首元素的地址。然而,差别也是有的。int 是4个字节长, zippo[0] 指向4字节长的数据对象,对 zippo[0] 加 1 导致它的值增加4 。数组名 zippo 是包含两个 int 数的数组的地址,因此它指向 8 字节长的数据对象,对 zippo 加 1 导致它的值增加8 。
     

     分析 *(*(zippo+2) + 1)

    zippo 第1个大小为 2 个 int 的元素的地址
    zippo+2 第3个大小为 2 个 Int 的元素的地址
    *(zippo+2) 第3个元素,即包含2个 int 值的数组,因此也是其第1个元素(int 值)的地址
    *(zippo+2)+1 包含2个 int 值的数组的第2个元素(int 值)的地址
    *(*(zippo+2)+1) 数组第3行第2个 int 的值(zippo[2][1])
     

    2.2 指向多维数组的指针

      int (* pz) [2]; //pz 指向一个包含2个int值的数组

      该语句表明 pz 是指向包含2个 int 值的数组的指针。使用圆括号的原因是因为表达式中 [] 的优先级高于 * 。

      如果我们这样声明:  int * pax[2];//创建两个指向单个 int 值的指针

      那么首先 [] 与 pax 结合,表示 pax 是包含两个某种元素的数组。然后和 * 结合,表示 pax 是两个指针组成的数组。最后,用 int 来定义,表示 pax 是由两个指向 int 值的指针构成的数组。这种声明会创建两个指向单个 int 值的指针。 
     

    2.3指针赋值事项

      把 const 指针赋给非 const 指针是错误的,因为可能会使用新指针来改变 const 数据。

      但是把 const 指针赋给 const 指针是允许的,这样赋值有一个前提:只进行一层间接运算。
    例:
    int * p1;
    const int * p2;
    const int ** p3;
     
    p1 = p2;    //非法,把const指针赋给非const指针
    p2 = p1;    //合法,把非const指针赋给const指针
    p3 = &p1;    //非法,把非const指针赋给const指针,进行多层间接运算
     

    2.4函数和多维数组

      一般的,声明N维数组的指针时,除了最左边的方括号可以留空之外,其他都需要填写数值。

      int sum (int ar[][10][20][30], int rows);

      等效原型表示:  int sum(int (*ar)[10][20][30], int rows]);

      此处 ar 指向一个 10*20*30 的 int 数组。

  • 相关阅读:
    HDU 1284 思维上的水题
    Buy Tickets POJ
    K-th Number Poj
    主席树入门+博客推荐
    Greg and Array CodeForces 296C 差分数组
    三连击 P1008 洛谷 python写法
    Lost Cows POJ 2182 思维+巧法
    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论
    Can you answer these queries? HDU 4027 线段树
    敌兵布阵 HDU 1166 线段树
  • 原文地址:https://www.cnblogs.com/Alling/p/3971102.html
Copyright © 2020-2023  润新知