指针的自增与优先级详解
小试牛刀
- 代码示例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++自增知识再来看会很好理解喔!!