http://blog.csdn.net/onlyou930/article/details/6725051

说来惭愧,写C++有一段时间了。这个问题从来没有认真考虑过,此次标记于此:

考虑如下问题:

1     char a[20];

2     int *ptr = (int *)a;

3     ptr++;

第3句ptr++实际为ptr右移一个int空间(即4个字节)的距离,此时ptr指向a[4]。

若第3句改为

int *p = ptr + 2;

则p指向a[8]

这里说明当指针加整数时,指针向后偏移的距离看的是声明该指针的类型(此处即int),而非指向的实际类型(此处即char)!!!

另外,如果我就是想在第3句处得到a后面一个字节的地址怎么办?

可以这样:

void *p = a;

p = p + 1;

(这里注意:c++不允许p++或++p)

void类型的指针加整数,即为指针实际向后偏移的字节数。

同理,若

int *pa0 = (int *)&a[0];

int *pa4 = (int *)&a[4];

std::size_t s = pa4 - pa0;

则s等于1

那么如果

int *pa3 = (int *)&a[3];

int *pa5 = (int *)&a[5];

std::size_t s2 = pa3 - pa0;

std::size_t s3 = pa5 - pa0;

这里的s2,s3又分别等于多少呢,

是的,如你所想:s2等于0,s3等于1

可见,同类指针(当然也只有同类指针允许相减,如pa3和pa0)相减得到的整数值,等于两指针减的距离除以sizeof(声明指针的类型),然后取整(此处即static_cast<int>((pa3 - pa0) / sizeof(int)))。

[转] C++指针加整数、两个指针相减的问题的更多相关文章

  1. JAVA基础学习之final关键字、遍历集合、日期类对象的使用、Math类对象的使用、Runtime类对象的使用、时间对象Date(两个日期相减)(5)

    1.final关键字和.net中的const关键字一样,是常量的修饰符,但是final还可以修饰类.方法.写法规范:常量所有字母都大写,多个单词中间用 "_"连接. 2.遍历集合A ...

  2. oracle 两个时间相减

    oracle 两个时间相减默认的是天数 oracle 两个时间相减默认的是天数*24 为相差的小时数 oracle 两个时间相减默认的是天数*24*60 为相差的分钟数 oracle 两个时间相减默认 ...

  3. C#两个时间相减

    原文地址:http://www.jb51.net/article/60177.htm using System; using System.Collections.Generic; using Sys ...

  4. C#实现两个时间相减的方法

    脚本之家看到的,关于两个时间差值的获取 http://www.jb51.net/article/60177.htm using System; using System.Collections.Gen ...

  5. mssql sqlserver 使用sql脚本实现相邻两条数据相减的方法分享

    摘要: 下文讲述使用sql脚本实现相邻两条数据相减的方法,如下所示: 实验环境:sql server 2008 R2 实现思路: 1.使用cte表达式,对当前表进行重新编号 2.使用左连接对 表达式 ...

  6. c语言中,指针加1的情况.指针变量详细介绍

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型, 指针所指向的 类型, 指针的值或者叫指针所指向的内存区, 还有指针本身所占 ...

  7. mysql 中两个日期相减获得 天 小时 分钟 或者 小时:分钟的格式

    /**有一个需求,要求获得两个日期想减的天数,小时数,分钟数.通过查找资料,于是乎我写出了如下代码,来获得两个字段.*/ IFNULL(CONCAT( ,'-',''), ),),'天')), ),) ...

  8. js两个时间相减

    平常总会遇到需要算两个日期之间是多少天,以下是使用JavaScript算时间差多少天的: // 给日期类对象添加日期差方法,返回日期与diff参数日期的时间差,单位为天 Date.prototype. ...

  9. MySQL 相邻两条数据相减

    <!-- 计算每两次消费的间隔天数 --> SELECT B.MEN_ID,TIMESTAMPDIFF(DAY,B.PRE_DATE,B.CURR_DATE) AS DAYS FROM ( ...

随机推荐

  1. Android Fragment基础及使用

    同一个app内的界面切换 用Fragment比较合适,因为Activity比较重量级 Fragment 轻量级,切换灵活 --------------------------------------- ...

  2. Egret HTTP网络

    HTTP 请求与响应: private createGameScene():void { //HTTP 1.0 var request = new egret.HttpRequest(); reque ...

  3. OC面向对象的三大特征

    OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可 ...

  4. Borg Maze

    poj3026:http://poj.org/problem?id=3026 题意:在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用 ...

  5. ios入门之c语言篇——基本函数——5——素数判断

    参数返回值解析: 参数: m:int,需要判断的值: 返回值: 0:非素数 1:素数 函数解析: 注意:函数没有对输入进行判断,请自己屏蔽非法输入 int prime(int m) { int tem ...

  6. J2EE和EJB有什么关系?

    其实j2EE就是java的企业版,与javaSE(标准版)有是有区别的,所以运行环境会有差异(简单点可以说,这是两组不同的接口),我们一般所熟悉的tomcat仅仅只实现了j2ee的一小部分规范,它只是 ...

  7. 线性表的顺序存储结构——java

    线性表的顺序存储结构:是指用一组地址连续的存储单元一次存放线性表的元素.为了使用顺序结构实现线性表,程序通常会采用数组来保存线性中的元素,是一种随机存储的数据结构,适合随机访问.java中ArrayL ...

  8. AOP举例子

    切面类TestAspect package com.spring.aop; /** * 切面 * */ public class TestAspect { public void doAfter(Jo ...

  9. scheme和common lisp 区别

    Scheme and Common Lisp use different names for some of the basic system functions. Many Lisp program ...

  10. node.js基础模块http、网页分析工具cherrio实现爬虫

    node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言      说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherri ...