理解*ptr++
来源:互联网 发布:数据库中模糊查询 编辑:程序博客网 时间:2024/06/05 18:01
理解*ptr++
这是C语言中指针的基本用法之一,我们先来看一个小例子。下面是代码:
int main(void){ char *p = "Hello"; while(*p++) printf("%c", *p); return 0;}
这段代码中第一句表达式:
char *p = "Hello";
声明了指向char类型的指针p,当我们说“指向char类型的指针”时到底是什么意思呢?实际上很简单:p的值就是一个存放char类型元素的地址,p告诉我们在内存中有这么一块地址里面存放的是char类型的变量。
这句表达式初始化了指针p,将它指向字符串“Hello”的第一个字符,对于这一点我们要时刻记住p指向的并不是整个字符串,而只是第一个字符“H”,也就是说p的值是字符串“Hello”中“H”的地址。
下面是一个循环:
while (*p++)
这里面的*p++是什么意思呢?一般初学者都会有下面的几种疑惑:
- 前缀++和间接取值*的优先级。
- 后缀自增表达式的值的情况。
- 后缀自增表达式的副作用。
1、优先级,快速察看一下运算符的优先级表可知后缀运算符的优先级(16)高于引用运算符(15)。也就是说*p++可以表示为*(p++),也就是说*是作用于p++的。先来看P++部分。
2、后缀表达式值,p++的值是P++表达式的P之前的值。假设你有:
int i = 7;printf("%d\n", i++);printf("%d\n", i);
输出将会是:
78
可以看到i++ 的值是i自增之前的值。那么P++也就是P自增之前的值。p中的值是“H”的地址。
接下来*P++就很简单了,*代表取出p中目前地址所存放的值,也就是“H”。
也许有同学会问,既然*p++表示“H”,那么为什么没有显示出来呢,下面就要说道副作用了。
3、后缀表达式的副作用,后缀++表达式的值是当前变量的值,但是这个表达式运算过后会有副作用。回头再看一下上面的代码和输出。
在第一个printf()函数中i++的值为7,但在C语言中会保证在下一条语句执行前的某个时刻(之所以说某个时刻是因为这个时刻和机器相关),这一条语句的副作用会产生,也就是说在第二条printf()执行前i的值一定会被加一。顺便提一下,这是C标准中少数几个有这样保证的副作用。
在最前面的代码中,当*P++执行时他指向的是字符“H”,但之后p的值加一,最终在屏幕上显示的就是ello了。
- 理解*ptr++
- 理解接口开发中的*Ptr
- smart ptr 学习理解笔记
- int * (*ptr)()怎么理解(指向函数的指针)
- Smart ptr
- Ptr ReturnHandler
- int * (*ptr)()
- byte ptr
- shared ptr
- const ptr与ptr const比较
- printf("%d,%d\n", *ptr, *(++ptr))
- printf("%d,%d\n", *ptr, *(ptr++))
- 汇编里 PTR 用法
- C++ Share Ptr
- boost :Smart ptr
- 转帖 ptr的用法
- PTR、OFFSET、ADDR
- container_of(ptr, type, member)
- 手工清理swap分区方法
- (Deep Reinforcement Learning with Double Q-learning, H. van Hasselt et al., arXiv, 2015)(dqn)练习
- Unity3D-使用Admob接入谷歌广告
- 机器学习(周志华)_第 九章 聚类
- mybatis中的#{}与${}的区别
- 理解*ptr++
- 织梦dedecms栏目页如何添加数字递增 数字123456
- 禁止root用户ssh登录机器
- extjs中renderer的使用方法
- 乐观锁以及乐观锁的实现
- python——MTM动力指标
- Activity全方位了解,总有你不知道的一面
- web.xml详解
- 裁剪UIImage 裁剪图片得到裁剪区域图片