理解*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语言的根本 ...
随机推荐
- 【LeetCode练习题】Valid Palindrome
Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric char ...
- PHP初识
1. php是一种跨平台的语言,支持几乎全部的数据库. 以前觉得PHP与MYSQL是黄金组合,对于PHP能否支持MSSQL没有过了解,PHP支持几乎全部的数据库,也支持MSSQL(5.2.X版本可以用 ...
- ios block使用
BlockTest.h #import <Foundation/Foundation.h> typedef void (^didFinishBlock)(NSString *str); t ...
- 导致flash屏幕重绘的几种方式及避免重绘的方法
导致屏幕重绘的几种原因: 1.最常见的是情况就是舞台上的可视组件在形状.位置.状态(alpha, scale…)发生改变的时候会触发Flash Player 的重绘. 2.当一个DisplayObje ...
- QOdbc 读写 excel
).toString(); ).toInt(); qDebug()<< name << age <<endl; } // 关闭数据库 db.close(); } i ...
- java判断数据类型两种方式
instanceof String s = ""; System.out.println(s instanceof String); // true simp ...
- 使用 ETag 和 Last-Modified 报头减轻服务器压力(转)
介绍你的网站在并发访问很大并且无法承受压力的情况下,你会选择如何优化?很多人首先会想从服务器缓存方面着手 对程序进行优化,许多不同的服务器缓存方式都有他们自己的特点,像我曾经参与的一些项目中,根据缓存 ...
- AE分级渲染
分级渲染classbreakrenderer位于carto类库中,进行分级渲染时,首先要将相应图层按照某一Field分级.可使用esrisystem类库中的iclassifyGEN类的classify ...
- 两个listbox 无刷新互动
页面代码: <table border="0" cellpadding="0" cellspacing="0" style=" ...
- vs2013 JS代码提示
1.JS提示 在Js文件头部加 /// <reference path="ext-all-dev.js" /> 要求引用的js和本js在同一目录,否则需要全部路径