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

Posted bitcarmanlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ *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;

上面代码输出为

*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)++自增的指针指向的数据!
这样就比较清晰了

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于c++ *p++ (*p)++ ++(*p)详细实战解读的主要内容,如果未能解决你的问题,请参考以下文章

lanczos算法及C++实现实对称三对角阵特征值分解的分治算法

vs2012调试时怎么查看堆中的数据(动态数组)? 求详细解答。 用的c++

精选力扣500题 第17题 LeetCode 33. 搜索旋转排序数组c++详细题解

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用

C++ 编写一个WIN32程序,向CMD传递参数

C++中,int&&表示啥意思?和int&有啥不同?