赞
踩
不管是我们平时看代码,还是自己写代码,经常都会看到诸如*p++,(*p)++, ++(*p)等写法。确实迷惑性比较强,而且一查资料,各种各样说法不一,容易让人云里雾里。因此,本文结合代码,给一个最准确详细的解释。
我们先上准确的结论:
*p++: 返回的是指针p指向的值。如果p是数组,则为数组的第一个元素。然后再将指针p自增1。
(*p)++:返回的是指针p指向的值。如果p是数组,则为数组的第一个元素。然后再将该指针指向的值自增1。
++(*p):获取指针p的位置取值,先自增1再返回值。
template<typename T>
void func2(T& t) {
int length = sizeof(t)/sizeof(t[0]);
for(int i=0; i<length; i++) {
cout<<t[i]<<" ";
}
cout<<endl;
cout<<endl;
}
void func3() {
int nums[] = {1, 2, 3, 4, 5};
int *p = nums;
int n1 = *p;
cout<<"*p test: "<<endl;
cout<<n1<<endl;
cout<<"now p is: "<<p<<endl;
func2(nums);
cout<<"*p++ test: "<<endl;
int n2 = *p++;
cout<<n2<<endl;
cout<<"now p is: "<<p<<endl;
func2(nums);
cout<<"(*p)++ test: "<<endl;
int n3 = (*p)++;
cout<<n3<<endl;
cout<<"now p is: "<<p<<endl;
func2(nums);
cout<<"++(*p) test: "<<endl;
int n4 = ++(*p);
cout<<n4<<endl;
cout<<"now p is: "<<p<<endl;
func2(nums);
}
int main(int argc, char const *argv[])
{
func3();
return 0;
}
上面代码输出为
*p test:
1
now p is: 0x7ffeea0872a0
1 2 3 4 5
*p++ test:
1
now p is: 0x7ffeea0872a4
1 2 3 4 5
(*p)++ test:
2
now p is: 0x7ffeea0872a4
1 3 3 4 5
++(*p) test:
4
now p is: 0x7ffeea0872a4
1 4 3 4 5
我们来逐行分析一下上述代码
首先*p操作赋值给n1,此时n1就是nums[0],地址就是数组首元素地址0x7ffeea0872a4,没什么好说的。
然后*p++这行,返回的值是p指针位置的数据,即1。并且此时p指针的位置向后移动一个元素,我们注意看此时p的内存位置为0x7ffeea0872a4,刚好与上次差4个字节,因为一个int类型就是占4字节,符合预期。
(*p)++这行,先将p指针位置的数据取出来。注意因为上次p指针位置已经向后移动了一位,所以此时返回的元素是2。同时,取值返回以后,该位置的元素还要自增1,所以如果我们将整个数组打印出来,发现第二个元素已经变成了3。
++(*p) 与(*p)++不同在于,就是返回的值是经过自增1以后的值。所以此时数组第二个元素已经是4,返回来的值也已经是4。
如果一句话总结的话
*p++自增的是指针地址!
(*p)++自增的指针指向的数据!
这样就比较清晰了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。