zoukankan      html  css  js  c++  java
  • 05深入理解C指针之---指针声明和解引

      该系列文章源于《深入理解C指针》的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教。  

      一、指针声明:

        1、声明普通变量:“数据类型 + 空格 +  变量名 + ;”实现普通变量的声明语句;

        2、声明指针:“数据类型 + 空格 +  变量名 + ;”只要在数据类型和变量名之间加一个“*"即可;

        3、应用:

          int  var1 = 10;            //声明普通变量,int是数据类型,空格作为int和var1的分割符,var1作为变量名

          (1)int * ptrVar1;         //*表明将变量声明为指针

          (2)int* ptrVar1;

          (3)int *ptrVar1;

          (4)int*ptrVar1;          //(1)(2)(3)(4)四种声明方式都是合法的,并且是完全等价的, 根据自己的眼光选择并坚持即可

          注*:*既可以作为指针变量的声明标志;*也可以作为乘法运算的符号;*又可以作为指针的解引用中,可以根据上下文很容易区别

      二、&操作符:

        1、返回操作变量的地址;

        2、常常利用之完成指针的初始化,一般在指针声明之后应尽快初始化;

        3、应用:

          &var1;             //获取变量var1的地址;下面千万不能写*ptrVar1 = &var1;否则程序一定会出错的

          ptrVar1 = &var1         //将变量var1的地址赋值给指针变量ptrVar1,通常又称为指针指向变量var1,

      三、指针解引:

        1、返回指针变量值(地址)处的变量值;

        2、常常利用之完成指针的修改;

        3、应用:

          var1 = 11;             //使用变量var1修改其内容,由10变为11

          *ptrVar1 = 12;           //使用指针解引*ptrVar1修改变量var1内容,由11变为12

      四、指针打印:

        1、打印指针变量值(地址)或普通变量的地址,在printf函数中,使用%x、%0、%p占位符占位即可;

        2、常常查看指针的值或变量的地址,一般打印出来的是虚拟内存地址;

        3、应用:

          程序代码,打印变量var1地址和指针变量ptrVar1的值,通过指针变量的使用,为修改变量提供新的思路:

     1 #include <stdio.h>
     2 
     3 int main(int argc, char **argv)
     4 {
     5     int var1 = 10;
     6     int *ptrVar1 = &var1;
     7     printf("The ptrVar1 address: %p
    ", &ptrVar1);
     8     printf("The var1 address: %p and ptrVar1 value: %p
    ", &var1, ptrVar1);
     9     printf("The var1 value: %d and *ptrVar1 value: %d
    ", var1, *ptrVar1);
    10 
    11     return 0;
    12 }  

        执行结果:

    The ptrVar1 address: 0x7fff937d6250
    The var1 address: 0x7fff937d625c and ptrVar1 value: 0x7fff937d625c
    The var1 value: 10 and *ptrVar1 value: 10

        修改后的代码:

     1 #include <stdio.h>
     2 
     3 int main(int argc, char **argv)
     4 {
     5     int var1 = 10;
     6     int *ptrVar1 = &var1;
     7     printf("The ptrVar1 address: %p
    ", &ptrVar1);
     8     printf("The var1 address: %p and ptrVar1 value: %p
    ", &var1, ptrVar1);
     9     printf("The var1 value: %d and *ptrVar1 value: %d
    ", var1, *ptrVar1);
    10 
    11     var1 = 11;
    12     printf("The ptrVar1 address: %p
    ", &ptrVar1);
    13     printf("The var1 address: %p and ptrVar1 value: %p
    ", &var1, ptrVar1);
    14     printf("The var1 value: %d and *ptrVar1 value: %d
    ", var1, *ptrVar1);
    15 
    16     *ptrVar1 = 12;
    17     printf("The ptrVar1 address: %p
    ", &ptrVar1);
    18     printf("The var1 address: %p and ptrVar1 value: %p
    ", &var1, ptrVar1);
    19     printf("The var1 value: %d and *ptrVar1 value: %d
    ", var1, *ptrVar1);
    20 
    21     return 0;
    22 } 

        修改后的执行结果:

    The ptrVar1 address: 0x7ffc5e7477d0
    The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
    The var1 value: 10 and *ptrVar1 value: 10
    The ptrVar1 address: 0x7ffc5e7477d0
    The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
    The var1 value: 11 and *ptrVar1 value: 11
    The ptrVar1 address: 0x7ffc5e7477d0
    The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
    The var1 value: 12 and *ptrVar1 value: 12

      五、指针阅读:

        1、遇到复杂的指针表达式时,从右往左阅读指针表达式更容易;

        2、应用:

          (1)const int *ptrVar1;        //最右边的ptrVar1是一个变量

          (2)const int *ptrVar1;        //ptrVar1是一个指针变量

          (3)const int *ptrVar1;        //ptrVar1是一个指向整型数据的指针变量

          (4)const int *ptrVar1;         //ptrVar1是一个指向整型常量数据的指针变量

      六、指针拾遗:

        1、空指针的表示可以让指针赋值为NULL,也可以将指针赋值为整型值0,也可以将指针赋值为字符型数据'',根据自己的需要选择

          1)、ptrVar1 = 0;        //将指针ptrVar1变量不指向任何地址,指针变量不初始化可以指向任何地址

          2)、ptrVar1 = NULL;        //将指针ptrVar1变量不指向任何地址,指针变量不初始化可以指向任何地址

        2、void指针,通用指针,万能指针,可以转换成任何类型的指针,它有几个特点:

          1)、void指针具有与char指针相同的形式和内存对其方式;

          2)、void指针和别的指针永远不会相等,除非两个都是NULL的void型指针;

          3)、任何指针都可以被赋值给void指针,并能被顺利完好的转换回来;

          4)、void指针只能用在数据指针,不能用于函数指针上

          5)、void指针可以转换成任何指针,一旦转换成与原来不同类型的指针,就无法再安全转换成原来的指针了;

        

  • 相关阅读:
    Vue异步数据交互 promise axios async fetch
    JS数组或对象转为JSON字符换 JavaScript JSON.stringify()
    JS返回数组的最大值与最小值
    Error: Cannot find module './application'
    Express框架
    NodeJS项目制作流程
    模板引擎art-template
    基于NodeJS的网络响应原理与HTTP协议
    leetcode 953. 验证外星语词典 做题笔记
    leetcode 771. 宝石与石头 做题笔记
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6946821.html
Copyright © 2011-2022 走看看