*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) 等价
*p++、*(p++)、++*p、++(*p)、(*p)++相关推荐
- Go 学习笔记(54)— Go 第三方库之 uber-go/zap/lumberjack(记录日志到文件、支持自动分割日志、支持日志级别、打印调用文件、函数和行号)
1. 简要说明 zap 是 uber 开源的 Go 高性能日志库,支持不同的日志级别, 能够打印基本信息等,但不支持日志的分割,这里我们可以使用 lumberjack 也是 zap 官方推荐用于日志分 ...
- 用v-for循环动态定位坐标显示元素,并遍历元素的left和top坐标位置(只需要用到元素的宽高、索引、每行显示数量)
v-for="(index,$i) in total" :key="$i":style="{left:`${itemWidth*((index-1)% ...
- Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)
项目结构 index.js //必须要安装否则就别想运行了❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤ //npm ...
- 解题报告(一)B、(CF453D) Little Pony and Elements of Harmony(FWT经典套路 + 任意模数 k 进制FWT + 快速幂)(2)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 1、输入四个整数,按照从小到大顺序输出。(20分)
题目: /* 1.输入四个整数,按照从小到大顺序输出.(20分) */ 代码: 注:题目说的是四个数的排序,我就直接写了个冒泡排序 public class One207 {public static ...
- R语言ggplot2可视化:可视化华夫饼图(Waffle Chart) 、华夫饼图可以直观地显示完成度(百分比)或者部分占整体的比例、华夫饼图适合于同类型指标的比较(Waffle Chart)
R语言ggplot2可视化:可视化华夫饼图(Waffle Chart) .华夫饼图可以直观地显示完成度(百分比)或者部分占整体的比例.华夫饼图适合于同类型指标的比较(Waffle Chart) 目录
- 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) 目录
- R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用fa.diagram函数可视化斜交旋转因子分析、并解读可视化图形
R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.使用fa.diagram函数可视化斜交旋转因子分析.并解读可视化图形 目 ...
- R语言plotly可视化:plotly可视化箱图、相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数、linear、inclusive、exclusive)
R语言plotly可视化:plotly可视化箱图.相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数.linear.inclusive.exclusive) 目录
- python使用openCV把原始彩色图像转化为灰度图、使用矩阵索引的方式对数据数据进行剪裁(image cropping)
python使用openCV把原始彩色图像转化为灰度图.使用矩阵索引的方式对数据数据进行剪裁(image cropping) 目录
最新文章
- mdk编译后的HTML,[转载]keil MDK编译完成后,Program Size:
- 操作Docker容器
- LeetCode_脑筋急转弯
- mysql数据库安装2017_mysql——概述和安装
- STM32H743+CubeMX-串口非空闲中断接收
- zz JQuery 插件
- Bellman-ford算法、SPFA算法、SPFA判断负环(附例题)
- 阿里云 oss 图片在 img 中访问失败,浏览器中正常访问
- Julia:last() 和first()
- 别再说找不到web前端项目练手了,这套最全的前端实战案例请拿去
- Android 基于x5Webview 浏览文件 office文档
- 汇编语言--寄存器间接寻址
- PS_一寸(2.5*3.5cm)照片排列在六寸(4*6)相片纸
- wfp 禁用ip_WFP网络过滤驱动——限制网站访问
- 相似度(距离计算)汇总
- 电容的安装电感的计算公式
- Mac电脑什么截图软件最好用?Snipaste for Mac实用截图教程
- MySQL:由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可能会解决此问题
- 【高项】第14章 信息文档管理与配置管理
- ModuleNotFoundError: No module named
热门文章
- Android图形图像处理:马赛克(Mosaic)效果
- 五子棋AI设计(转载)
- oracle 按照条件导出数据
- 基于STM32的flash读写和DAC音频播放
- 人工智能畅想ps海报教程_看完最新版PS人工智能演示,90%的设计师都吓傻了!...
- leetcode股票买卖问题全解(转载他人)
- 20202413 2022-2023-2 《网络与系统安全技术》实验五报告
- Python 如何让打印内容变得优雅(颜色打印)
- Vegas色彩匹配特效怎么使用?
- 计算机应用情话,最新版暖人的情话短句 看看你有没有被撩倒