21年4月14指针(一)__精华

1. 赋值语句解析

2. 经典代码分析

1. 赋值语句解析

int    *s,p;     =>     这里的 s 是 int 类型的 指针变量,p 是 int 类型的 整型变量

int *p;                 =>     *是和变量名结合不是和类型名结合

(char *)p;       =>    把类型名和*括起来,表示强转。就是把  p  强制转换成   char类型的指针变量  

 

2. 经典代码分析

 ++自增符号,*指针符号  =>  这俩个的优先级都是第2,结合方向自右向左

  int ar[5] = {12,23,34,45,56};
  int* p = ar;
  int x = 0;
  int y = 0;

  x = *++p;
  y = *p;
  printf("%d %d\n",x,y);

指针p先是++,指向下一个地址,也就是23的地址  =>  然后,*发挥作用,取值23

<<  输出  <<  23 23

 

  x = ++*p;
  y = *p;
  printf("%d %d\n", x, y);

p已经指向了23,结合方向自右向左,先得到23的值  =>  然后,把23的值++

因为++有回写能力,也就是改变自身的值,这里的ar[1]已经变成24了,这个要注意。ar[1]的值已经改变

<<  输出  <<  24 24

 

  x = *p++;
  y = *p;
  printf("%d %d\n", x, y);

这一句好好理解,*p++ 这里的++是后置的,后置的,后置的(后置的++会在表达式结束后执行。就是;之后,这个语句结束了,才会++)

所以这里的p是先取其值,完成对x的赋值后,*的作用消亡了,他结束了。  =>   然后,执行++,对地址++

*p++ 与 *(p++) 是等效的,因为都是后置++,他执行++的时候,*的作用已完成并且消亡了。

<<  输出  <<  24 34

 

  x = (*p)++;
  y = *p;
  printf("%d %d\n", x, y);

这里 (*p)++,括号是把(*p)括起来了,把(*p)看作整体,先完成赋值操作

然后,后置++是对值++,而不是对地址

<<  输出  <<  34 35

 

 2.1

(*p)++     *(p++)      *p++    =>  第一个(*p)是整体,对这个整体++。    后两个等效。 

  

2.2

++不管前后,都有回写能力,即改变自身

特别注意指针里面的  ++  对 值 操作时候值 本身会改变。  牢牢记住

 

2.3

++自增符号,*作指针符号时候  =>  这俩个的优先级都是第2,结合方向自右向左

(*作乘号,优先级第3)

 

posted @ 2021-04-15 11:25  没壳的蜗牛  阅读(58)  评论(3编辑  收藏  举报