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\n", &ptrVar1);
 8     printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
 9     printf("The var1 value: %d and *ptrVar1 value: %d\n", 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\n", &ptrVar1);
 8     printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
 9     printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1);
10 
11     var1 = 11;
12     printf("The ptrVar1 address: %p\n", &ptrVar1);
13     printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
14     printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1);
15 
16     *ptrVar1 = 12;
17     printf("The ptrVar1 address: %p\n", &ptrVar1);
18     printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
19     printf("The var1 value: %d and *ptrVar1 value: %d\n", 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,也可以将指针赋值为字符型数据'\0',根据自己的需要选择

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

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

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

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

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

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

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

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

    

posted @ 2017-06-05 20:06  叕叒双又  阅读(458)  评论(0编辑  收藏  举报