*p++、*(p++)、++*p、++(*p)、(*p)++

在讨论指针自增问题之前,我们首先要知道*和++ 是同级运算,其运算先后及表达式的最终结果仅受自增特性的影响,所以我们的讨论才有意义。

       而对于*、++、和p的组合,可以分为以下5种:

                右自增的3种:

                        *p++        *(p++)       (*p)++

                左自增的2种:

                        ++*p        ++(*p)

        按照我最初的设想,构造数组x[3],并用a收集表达式的值,写出代码如下:

        

#include<stdio.h>
 
void main() {
 
    int* x[3] = { 1,2,3 };
    int* p;
    int a=1; //存放表达式的值
 
 
    p = &x; //使p指向数组x
    printf("1 Init=%d     p=%d    *p=%d\n", a, p, *p);
 
    a = *p++;
    printf("2 *p++=%d   p=%d   *p=%d\n", a, p, *p);
 
    p = &x; //重置指针p
    a = *(p++);
    printf("3 *(p++)=%d  p=%d  *p=%d\n", a, p, *p);
 
    p = &x;
    a = (*p)++;
    printf("4 (*p)++=%d   p=%d   *p=%d\n", a, p, *p);//!!此处出现问题
 
    p = &x;
    a = ++ * p;
    printf("5 ++*p=%d   p=%d   *p=%d\n", a, p, *p); //
 
    p = &x;
    a = ++(*p);
    printf("6 ++(*p)=%d   p=%d   *p=%d\n", a, p, *p);
 
 
}
运行结果如下:

1 Init=1               p=5241208       *p=1
2 *p++=1           p=5241212           *p=2
3 *p(++)=1          p=5241212          *p=2
4 (*p)++=1           p=5241208           *p=2
5 ++*p=3           p=5241208           *p=3
6 ++(*p)=4           p=5241208           *p=4

 通过第1行到第3行的结果,我们可以证明,因为右++需要在表达式整个运行完之后执行,所以表达式本身的值不受右++和()的影响。运行完之后,p增加一个地址单元长度,指向数组下一个数据元素。

但是在第四行,p指向的地址没有改变,但是*p的值发生了变化,这是由于(*p)等价于x[0](数组下标为0,位序是1),所以表达式  (*p)++  相当于是使数组第一项数据元素自增。

并且这一原因也导致后续的每一次左++都使 *p (a[0])自增1。

所以我们在(*p)++=1 执行后,重置x[0],再次运行如下代码:

void main() {
 
    int* x[3] = { 1,2,3 };
    int* p;
    int a=1; //存放表达式的值
 
    
    p = &x;
    printf("1 Init=%d     p=%d    *p=%d\n", a, p, *p);
 
    a = *p++;
    printf("2 *p++=%d   p=%d   *p=%d\n", a, p, *p);
 
    p = &x;
    a = *(p++);
    printf("3 *(p++)=%d  p=%d  *p=%d\n", a, p, *p);
 
    p = &x;
    a = (*p)++;
    printf("4 (*p)++=%d   p=%d   *p=%d\n", a, p, *p);
 
    x[0] = 1;
    p = &x;
    a = ++ * p;
    printf("5 ++*p=%d   p=%d   *p=%d\n", a, p, *p);
 
    x[0] = 1;
    p = &x;
    a = ++(*p);
    printf("6 ++(*p)=%d   p=%d   *p=%d\n", a, p, *p);
 
}
可以得到如下结果:

1 Init=1        p=9699016       *p=1
2 *p++=1   p=9699020   *p=2
3 *(p++)=1  p=9699020  *p=2
4 (*p)++=1   p=9699016   *p=2
5 ++*p=2   p=9699016   *p=2
6 ++(*p)=2   p=9699016   *p=2

证明我们的猜想。

总结:

 *p++ 和 *(p++) 等价         ++*p 和 ++(*p) 等价

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值