*(p++):取出指针p所指地址中的数据,指针+1
p++ : 指针+1 哗耐
*p++ : 等同于 *(p++) 乱闹春
++*p : 指针所指地址中的数据+1
(*p)++ : 取地址数据,地址中的数据+1
********************************************************
tip1. * 与 ++的优先级相同的,它们的结合性都是自右向左
tip2. ()的优先级高于*和++
****************************************************************
优先级、结合性分析:
*p++ 由(tip1)可知,p先与++结合,再与*结合,
*(p++) 由(tip2)可知,p先与++结合,再与*结合
得出结论:*p++等同于 *(p++)
**********************************************************
变量分析:
*(p++) 由(tip2)可知,是p先与++结合,变量是 p,
得出结论:*(p++) // 是指针所指的地址值在增加 (不同点)
(*p)++ 由(tip2)弯旅可知,p先与*结合,得到*p
是*p与++结合,变量是 *p
得出结论:(*p)++ //是指针所指地址中的数据值在增加 (不同点)
********************************************************************
小结:
因为(tip1、tip2)可得出:
1.指针所指地址自增
*p++等同于*(p++)
*++p等同于*(++p)
2.指针所指地址中数据自增
++(*p)等同于++*p
(*p)++
*********************************************************
(左自增:先求变量变化,再输出)
形式:++p、*++p、++*p、++(*p)、
(右自增:先输出变量当前所指值,再求变量的变化)
形式:p++、*p++、(*p)++、*(p++)
哪个是变量:(在tip1、tip2的基础上)与 ++ 结合的整体是变量
++p : p 是变量、
++(*p): (*p)是变量
***********************************************************
*p++ 先取指针p指向或判的值(数组第一个元素1),再将指针p自增1;
(*p)++ 先去指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2
*++p 先将指针p自增1(此时指向数组第二个元素),* 操作再取出该值
++*p 先取指针p指向的值(数组第一衫物改个元素1),再将该值自增1(数蚂旅组第一个元素变为2)
#include
int main()
{
int a[2]={1,2},*p=a;
// printf("%d\n",*p++); //等哗郑于1
//printf("%d\n",*++p); //等于2
// printf("%d\n",(*p)++); //等于1
//稿租printf("%d\n"键芦兆,++(*p)); //等于2
return 0;
}
。
一般能少这样用指针就不要用这种奇怪的表达方式,除非是考试。
指针说穿了,就是一个存着内容地址的数据。
比如,声明一个*p,不管*p是什么类型,p自身的数据只袭纳可能是2byte或者4byte的数据,如0x2000,这个值,实际上是p指向的数据的地址;
而*p是p指向的内容的数据,取决于声明时的类型,长度由类型决定,运闹比如char *p;byte *p;long *p;而内容就是char型的值,比如0xFA;
因此你就可以看出上面的问题的答案了。
*(p++),是地址p先++,旁禅罩然后,再取出该地址的值。
p++,直接就是地址加1。
*p++,*比++的优先级高,所以,是*p指向的内容被++了。
++*p,同理,与*p++结果一样。
(*p)++,这个与*p++结果一样。
这样学习C++累不