Linux学习---指针运算、修饰符(const、volatile、typedef)及、运算符(++、--、+、-)

时间:2022-11-15 18:27:14
  • const:常量、只读【不能变】

    char *p;

    const char *p;    【T】  字符串内容可以为“hello world”或“aaa”,但只读(不可修改)

    char const *p;

    char * const p;    【T】  一般为硬件资源 ,地址不变,但地址内容可变。

    char *p const;

    const char * const p;    ROM

  • volatile

    防止优化指向内存地址。

   

  • typedef

   

  •  指针加法

  指针的加法、减法运算,实际上加的是一个单位,单位的大小为sizeof(p)

  指针的自增和加一是有区别的:

  eg: int *p;  p+1  //以p为参考位置(p值不变)。

          p++、p--  //地址会更新(p值有变化)。

  eg:  

    int a = 0x12345678;

    int b = 0x99991199;

    int *p1 = &b;

    char *p2 = (char *)&b;

   printf("p1+1 is %x,%x,%x\n",*(p1+!),p1[1],*p1+1);    //12345678,12345678,9999119a;

     printf("p2+1 is %x\n",p2[1]);      //  11  char型,p2=p[0] = 99(低八位),p[1]为11。

  注: *(p1+1) ===p1[1];    //此时[]为标签,不是数组。

     

  • 指针越界访问。

   ① 使用指针修改const修饰的值。

    eg:

      const int a= 10;
      int b = 20;

      printf("%x ",a);    //a = 14
      printf("%x ",b);    //14  可见连续声明的变量(同类型)二者之间相差为sizeof(int)。对int来说相差为1,即4bit。

      int *p = &b;

      p[1] = 30或*(p+1) = 30;    //该语句编译不报错,但是a输出的值仍是a,具体参考:https://blog.csdn.net/a3125504x/article/details/78835973

      printf("%x",p[1]);  

  • 指针逻辑操作符

    ①跟一个特殊值记性比较  0x0:地址的无效值,结束标志。

      if(p == 0x0)

        NULL

    ②指针必须是同类型的比较才有意义