5.2 面试题1
第一个运行结果为2 1
第二个运行结果为1 2
分析:这两段代码的不同之处就在for循环里,一个有a++一个没有。
要做对这题首先我们要知道,a++是先用a再自加1.而++a是现将a加一再作后续使用,了解了这一点后,我们还要知道for()循环体内部的操作是影响整个main函数的当然也包括for循环体内部。即第一个程序在for循环内判断完后,对a进行了自加1
然后循环体内有一次对a自加了1。所以对与第一个程序,第一次循环后a=2不再满足循环判断条件,循环结束,此时a=2,x=1。
对与第二个程序,执行第一次循环后,a=1,x=1,!x=0,不再满足循环条件,循环体内部将无法执行,但for括号内部x++仍可以执行,所以最终a=1,x=2.
5.2 面试题2
本题考查指针运算以及++a和a++的区别。
分析:从第九行开始,定义了一个有五个元素整数数组arr并为其初始化为{6,7,8,9,10}
*ptr = arr 等同于*ptr = &arr[0],即将数组arr的首地址传递给指针ptr(在C++中使用数组名字时,编译器会自动的将其认为是一个指向数组首个元素的指针)。现在相当于*ptr指向数组首个元素arr[0].
*(ptr++)+=123,等同于*ptr=*ptr+123;ptr++;前一句将ptr指针指向的数arr[0]加上了123,后一句将指针加一此时指针指向了arr[1]。(给一个指针加上或减去某个整数值,结果任然是指针,新的指针指向的元素与原来的指针相比前进了货后退了该整数个数值)
注意区别ptr++、*ptr++、*(ptr++)以及*(++ptr)
看这样一个程序*(++ptr)+=123;后*ptr=130、从这里我们可以看出
*(++ptr)与*(ptr++)的区别。前者先将指针进行移位操作再与123相加,后置先加上123,再将指针后移一步。总结来说++在前就先移指针。
*ptr++相当于ptr指针指向的数加了1,我们在对指针进行前后移动时是直接用指针名加或减某个数,即ptr+a,ptr-a
以上