当前位置: 首页 > 工具软件 > P* > 使用案例 >

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

欧阳博超
2023-12-01

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;
}

上面代码输出为

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

4.小结

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

 类似资料: