当前位置:   article > 正文

p++与++p解读_p++和++p

p++和++p

int a[]={5,6,7,8,9},*p;
p=a;

(1)(*p)++

	cout << "(*p)++=" << (*p)++ << endl;
	cout << "数组第一个元素值"<<a[0]<<endl;
  • 1
  • 2
  • 解读:(p)++,由于优先级,圆括号里面的先计算,所以先取p,再使(*p)自增1
    在这里插入图片描述
    这里输出5,然后a[0]加1,p指向a[0],数组为{6,6,7,8,9},

(2)++(*p)

	cout << "++(*p)=" << ++(*p) << endl;
	cout << "数组第一个元素值"<<a[0]<<endl;
  • 1
  • 2
  • 解读:++( * p),由于结合性,先使p自增1(即p地址中的值+1),再取p(这时地址中的值已经加一)。
    在这里插入图片描述
    这里输出6,p指向a[0],数组为{7,6,7,8,9},

(3)++*p

*等价于(2)++(p)
注:前三个中:p的指针都没有移动,都是指向数组第一个元素;
*因为(1)(2)中是因为(p)有括号优先级更大;所以没有移动;
(3)是因为 与++运算符 分离,就近先执行p;

(4)*p++

	cout << "*p++=" << *p++ << endl;
	cout << *p << endl;————p指向了第二个元素
  • 1
  • 2
  • 解读:p先跟*结合了,得到p指向的变量的值,即(*p),然后p再跟++结合,使指针p指向内存中下一个位置。
    在这里插入图片描述
    这里输出5,然后p指向a[1],数组为{5,6,7,8,9},——数组值未变;
    此时相当于遍历数组,移动指针p,*p取数组值,后p++移动指针进行遍历;

(5)*(p++)——不建议使用

与(4)结果一致,可以按(4)理解

(6)*++p

	cout << "*(++p)=" << *(++p) << endl;
	cout << *p << endl;
  • 1
  • 2
  • 解读:先使指针p指向内存中下一个位置,再取*p
    在这里插入图片描述
    这里输出6,然后p指向a[2],数组为{5,6,7,8,9},——数组值未变;

(7)*(++p)

等价于(6)

总结:

(1)如果是有括号如-++(*p)或(*p)++;
即先*p——即先取地址中的值,然后再++p(左加加)或者p++(右加加)则会改变数组中元素的值;

(2)如果是没有括号如-++*p;
但是为左加加;则此类同上,也会改变数组中元素的值;

(3)如果没有括号如-== p++,==
则是右加加;则此时为先取
p,再移动指针;此类并不会改变元素的值;
此类经常用来遍历数组;
此类*(p++)用法一致——不介意使用;

(4)*++p与 *(++p)都是先移动指针,再取值,所以对数组中的值都不会造成影响;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/79740
推荐阅读
相关标签
  

闽ICP备14008679号