当前位置:   article > 正文

c++ *p++ (*p)++ ++(*p)详细实战解读

*p++

0.前言

不管是我们平时看代码,还是自己写代码,经常都会看到诸如*p++,(*p)++, ++(*p)等写法。确实迷惑性比较强,而且一查资料,各种各样说法不一,容易让人云里雾里。因此,本文结合代码,给一个最准确详细的解释。

1.正确的结论

我们先上准确的结论:
*p++: 返回的是指针p指向的值。如果p是数组,则为数组的第一个元素。然后再将指针p自增1。
(*p)++:返回的是指针p指向的值。如果p是数组,则为数组的第一个元素。然后再将该指针指向的值自增1。
++(*p):获取指针p的位置取值,先自增1再返回值。

2.代码实例

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

上面代码输出为

*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 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

我们来逐行分析一下上述代码

首先*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。

4.小结

如果一句话总结的话
*p++自增的是指针地址!
(*p)++自增的指针指向的数据!
这样就比较清晰了

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

闽ICP备14008679号