理解*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);
输出将会是:
7
8
可以看到i++ 的值是i自增之前的值。那么P++也就是P自增之前的值。p中的值是“H”的地址。
接下来*P++就很简单了,*代表取出p中目前地址所存放的值,也就是“H”。
也许有同学会问,既然*p++表示“H”,那么为什么没有显示出来呢,下面就要说道副作用了。
3、后缀表达式的副作用,后缀++表达式的值是当前变量的值,但是这个表达式运算过后会有副作用。回头再看一下上面的代码和输出。
在第一个printf()函数中i++的值为7,但在C语言中会保证在下一条语句执行前的某个时刻(之所以说某个时刻是因为这个时刻和机器相关),这一条语句的副作用会产生,也就是说在第二条printf()执行前i的值一定会被加一。顺便提一下,这是C标准中少数几个有这样保证的副作用。
在最前面的代码中,当*P++执行时他指向的是字符“H”,但之后p的值加一,最终在屏幕上显示的就是ello了。
理解*ptr++的更多相关文章
- 对list_entry(ptr, type, member)的理解
如何根据一个结构体成员的地址.结构体类型以及该结构体成员名获得该结构体的首地址? #define list_entry(ptr, type, member) \ ((type *)((char *)( ...
- 深入理解图优化与g2o:g2o篇
内容提要 讲完了优化的基本知识,我们来看一下g2o的结构.本篇将讨论g2o的代码结构,并带着大家一起写一个简单的双视图bundle adjustment:从两张图像中估计相机运动和特征点位置.你可以把 ...
- 深入理解 C 语言的函数调用过程
来源: wjlkoorey 链接:http://blog.chinaunix.net/uid-23069658-id-3981406.html 本文主要从进程栈空间的层面复习一下C语言中函数调用的具体 ...
- 对c语言中malloc和free函数的理解
最近在复习c语言的时候再次用到了malloc函数和free函数,此处着讲解一下自己对这两个函数的理解和认识. 一. malloc函数和free函数的基本概念和基本的用法 对于malloc函数: 1. ...
- 深入理解 Win32 PE 文件格式
深入理解 Win32 PE 文件格式 Matt Pietrek 这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什 ...
- 深入理解C语言的函数调用过程
本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解. 先看一个最简单的程序: 点击(此处)折叠或打开 /*test.c*/ #include stdio. ...
- 有关CLR的初学小整理2(可能理解不深刻,望大牛指出)
针对原文有用的段落,写一写自己的理解,注释: 1. 托管exe文件被启动的时候,首先被PE Loader载入.PE Loader载入exe文件之后,会分析PE文件头的data directory ta ...
- 从实用主义深入理解c++虚函数
记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发生了巨大的转变,在大学的时候由 ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
随机推荐
- vb串口通信界面
界面如上: 程序如下: Dim num As Byte '申明一个全局变量为单字节型 '单击“清空接收缓冲区”按钮时,将接收缓冲区清空,此过程为“清空接收缓冲区”的单击事件 Private S ...
- [转]ReactJS入门教程
Refference From:http://www.cocoachina.com/webapp/20150721/12692.html 现在最热门的前端框架有AngularJS.React.Boot ...
- 4Sum 解答
Question Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c ...
- pyqt字符串分离开,放入列表中
string1 = ''''' the stirng Has many line In THE fIle ''' list_of_string = string1.split() print list ...
- ACM-简单题之Ignatius and the Princess II——hdu1027
转载请注明出处:http://blog.csdn.net/lttree Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Othe ...
- 又一道软通动力7K月薪面试题——银行业务调度系统
后期补充:网友对我诟病最多的就是我帮学生做面试题,说这是小偷和骗子行为,在此,我对自己给学员做面试题做出例如以下解释: (1)学员拿着面试题来找老师,学生也事先思考和尝试后实在没有办法,又求职心切才 ...
- PHP获取中英文混合字符串长度及截取
1.字符串长度 PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改 /** * PHP获取字符串中英文混合长度 * @param $str string 字符串 * ...
- SQL server根据值搜表名和字段
DECLARE @what varchar(800) SET @what='lll' --要搜索的字符串 DECLARE @sql varchar(8000) DECLARE TableCursor ...
- 一些不熟悉的SQL脚本--约束条件
1.根据表名查询主键的SQL语句 SELECT D.COLUMN_NAME AS COLNAME FROM USER_CONS_COLUMNS D, USER_CONSTRAINTS M WHERE ...
- confirm的用法 一般用于按钮操作时确定是否执行
<script type = "text/javascript" language = "javascript"> function clear1( ...