理解*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语言的根本 ...
随机推荐
- Linux环境 Mysql新建用户和数据库并授权
测试环境:linux 和Mysql 5.5.35 一.新建用户 //登录Mysql@>mysql -u root -p@>密码//创建用户mysql> insert into mys ...
- 单调队列-Hdu-4122-Alice's mooncake shop
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4122 题目意思: 一家月饼店,有n个订单,从2001年1月1日0时开始24小时营业开m个小时,且每个 ...
- java编程排错技巧
一.Eclipse提示错误The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from re ...
- SQLLoader8(加载的数据中有换行符处理方法)
SQLLDR加载的数据中有换行符处理方法1.创建测试表: CREATE TABLE MANAGER( MGRNO NUMBER, MNAME ), JOB ), REMARK ) ); 2.创建控制文 ...
- [HeadFirst-HTMLCSS学习笔记][第十四章交互活动]
表单 <form action="http://wickedlysmart.com/hfhtmlcss/contest.php" method="POST" ...
- CSS 相关知识总结
1 什么是CSS? CSS全称(Cascading Style Sheets)是一门指定文档该如何呈现给用户的语言. 2 为何使用CSS? CSS 文档信息的内容和如何展现它的细节想分离,文档细节即为 ...
- css链接,列表,表格
1.css链接 a:link - 正常,未访问过的链接 a:visited - 用户已访问过的链接 a:hover - 当用户鼠标放在链接上时 a:active - 链接被点击的那一刻 注意: a:h ...
- SQL SERVER 清空日志
DUMP TRANSACTION [TBNAME] WITH NO_LOGBACKUP LOG [TBNAME] WITH NO_LOGDBCC SHRINKDATABASE([TBNAME]) 1. ...
- javaScript动态添加样式
[动态添加css样式] <html> <head> <script type="text/javascript"> window.onload= ...
- TCP的流量控制(转载)
1.TCP的滑动窗口 为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认. TCP的两端都 ...