栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

0.前言

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

1.正确的结论

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

2.代码实例
template
void func2(T& t) {
    int length = sizeof(t)/sizeof(t[0]);
    for(int i=0; i
        cout<
    int nums[] = {1, 2, 3, 4, 5};
    int *p = nums;
    int n1 = *p;
    cout<<"*p test: "<
    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)++自增的指针指向的数据!
这样就比较清晰了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846916.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号