C语言中指针的自增与优先级{*p++,(*p)++}详解

指针的自增与优先级详解
小试牛刀
  • 代码示例1
 		int arr[] = { 1, 3668, 5, 7, 9};
         printf("%d\n", *p++ );//拿到arr[0]的值1
         printf("%d\n", *p++ );//拿到arr[1]的值3668
         printf("%d\n", *p++ );//拿到arr[2]的值5  
         printf("%d\n", *p++ );//拿到arr[3]的值7

通过上述代码输结果,我们可以得出p++会返回一个指向下一个地址的指针。也就是说p++是个后++执行过程,它执行完printf语句会,它会指向下一个地址,作为是个返回值给下一条用到的语句,等第二条printf语句执行时会拿到这个指针,所以第二个p指向了arr[1],然后通过解值拿到了3688这个数值。到此,我们抛出一个疑问:它是先解值还是先进行++操作?

  • 示例代码2
 int arr[] = { 1, 3668, 5, 7, 9};
 printf("%d\n", *p++ );//拿到arr[0]的值1
 printf("%d\n", *p++ ); //上条语句结束后指针往后移动了一下,
 						//指到到arr[1],然后又++,因为是后++,
 						//所以解得是arr[1]的值3668
 printf("%d\n", (*p)++ );//拿到上个++指向了arr[2],
 						//因为加了括号,所以先解值为5,然后++,
 						//把结果丢给了下语句。
 printf("%d\n", (*p)++ );//括号优先级高,先解值,指针未移动,
 						//还指向着arr[2],拿到上个printf丢下来的值5+1=6,
 						//故解值为6,然6++,语句执行结束把6++结果丢给下一条语句。

以上输出结果为:1,3668,5,6;到此我们可以得到*p++是先++后解值的说法。正是先++前两句ptintf语句的p指针才得以往后移动,后两句printf因为加了(),优先级提升,是先解值,然后是解得到的值++,所以最后一个printf语句拿到了5+1=6的结果。有兴趣的小伙伴可以在最后再添加一个printf语句,你会发现得到数值7的结果。

  • 示例代码3
    我们再来换种方式来验证
int arr[] = { 1, 3668, 5, 7, 9};
printf("%d\n", *p++ );//1
printf("%d\n", (*p)++ );//3668
printf("%d\n", arr[1] );//3669
printf("%d\n", (*p)++ );//3669

通过结果,我们不难推断出:第一个*p++是先++后解取值,但这语句还没运行结束,所以他指向还是在arr[0],然后*解值,拿到了1,语句执行结束,此时++效果才生成,指针下移到arr[1];执行第二条printf语句,此时括号优先级高,先解值,解arr[1]的值为3668,然后++,语句结束把3668+1=3669结果丢给下一条语句;执行下一个语句,我们通过打印arr[1]此时的值,发现上一条语句结束确实加了1,arr[1]的值被修改为了3669;执行最后一条语句,优先执行括号,此时指针指向的是arr[1],解取值得3669,然后++,把3669+1结果丢给了后面语句。

  • 通过以上两种验证方法,相信大家对指针的自增过程己有所掌握,如果有小伙伴还是无法理解,建议先去学习a++自增知识再来看会很好理解喔!!
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值