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

而对于*、++、和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) 等价

*p++、*(p++)、++*p、++(*p)、(*p)++相关推荐

  1. Go 学习笔记(54)— Go 第三方库之 uber-go/zap/lumberjack(记录日志到文件、支持自动分割日志、支持日志级别、打印调用文件、函数和行号)

    1. 简要说明 zap 是 uber 开源的 Go 高性能日志库,支持不同的日志级别, 能够打印基本信息等,但不支持日志的分割,这里我们可以使用 lumberjack 也是 zap 官方推荐用于日志分 ...

  2. 用v-for循环动态定位坐标显示元素,并遍历元素的left和top坐标位置(只需要用到元素的宽高、索引、每行显示数量)

    v-for="(index,$i) in total" :key="$i":style="{left:`${itemWidth*((index-1)% ...

  3. Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)

    项目结构 index.js //必须要安装否则就别想运行了❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤ //npm ...

  4. 解题报告(一)B、(CF453D) Little Pony and Elements of Harmony(FWT经典套路 + 任意模数 k 进制FWT + 快速幂)(2)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  5. 1、输入四个整数,按照从小到大顺序输出。(20分)

    题目: /* 1.输入四个整数,按照从小到大顺序输出.(20分) */ 代码: 注:题目说的是四个数的排序,我就直接写了个冒泡排序 public class One207 {public static ...

  6. R语言ggplot2可视化:可视化华夫饼图(Waffle Chart) 、华夫饼图可以直观地显示完成度(百分比)或者部分占整体的比例、华夫饼图适合于同类型指标的比较(Waffle Chart)

    R语言ggplot2可视化:可视化华夫饼图(Waffle Chart) .华夫饼图可以直观地显示完成度(百分比)或者部分占整体的比例.华夫饼图适合于同类型指标的比较(Waffle Chart) 目录

  7. R语言ggplot2可视化时间序列散点图、X轴和Y轴都是时间信息、使用as.POSIXct函数自定义指定Y轴的时间范围(setting time limits in y axis)

    R语言ggplot2可视化时间序列散点图.X轴和Y轴都是时间信息.使用as.POSIXct函数自定义指定Y轴的时间范围(setting time limits in y axis) 目录

  8. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用fa.diagram函数可视化斜交旋转因子分析、并解读可视化图形

    R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.使用fa.diagram函数可视化斜交旋转因子分析.并解读可视化图形 目 ...

  9. R语言plotly可视化:plotly可视化箱图、相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数、linear、inclusive、exclusive)

    R语言plotly可视化:plotly可视化箱图.相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数.linear.inclusive.exclusive) 目录

  10. python使用openCV把原始彩色图像转化为灰度图、使用矩阵索引的方式对数据数据进行剪裁(image cropping)

    python使用openCV把原始彩色图像转化为灰度图.使用矩阵索引的方式对数据数据进行剪裁(image cropping) 目录

最新文章

  1. mdk编译后的HTML,[转载]keil MDK编译完成后,Program Size:
  2. 操作Docker容器
  3. LeetCode_脑筋急转弯
  4. mysql数据库安装2017_mysql——概述和安装
  5. STM32H743+CubeMX-串口非空闲中断接收
  6. zz JQuery 插件
  7. Bellman-ford算法、SPFA算法、SPFA判断负环(附例题)
  8. 阿里云 oss 图片在 img 中访问失败,浏览器中正常访问
  9. Julia:last() 和first()
  10. 别再说找不到web前端项目练手了,这套最全的前端实战案例请拿去
  11. Android 基于x5Webview 浏览文件 office文档
  12. 汇编语言--寄存器间接寻址
  13. PS_一寸(2.5*3.5cm)照片排列在六寸(4*6)相片纸
  14. wfp 禁用ip_WFP网络过滤驱动——限制网站访问
  15. 相似度(距离计算)汇总
  16. 电容的安装电感的计算公式
  17. Mac电脑什么截图软件最好用?Snipaste for Mac实用截图教程
  18. MySQL:由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可能会解决此问题
  19. 【高项】第14章 信息文档管理与配置管理
  20. ModuleNotFoundError: No module named

热门文章

  1. Android图形图像处理:马赛克(Mosaic)效果
  2. 五子棋AI设计(转载)
  3. oracle 按照条件导出数据
  4. 基于STM32的flash读写和DAC音频播放
  5. 人工智能畅想ps海报教程_看完最新版PS人工智能演示,90%的设计师都吓傻了!...
  6. leetcode股票买卖问题全解(转载他人)
  7. 20202413 2022-2023-2 《网络与系统安全技术》实验五报告
  8. Python 如何让打印内容变得优雅(颜色打印)
  9. Vegas色彩匹配特效怎么使用?
  10. 计算机应用情话,最新版暖人的情话短句 看看你有没有被撩倒