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)