A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hpuie0703 中级黑马   /  2016-1-21 17:25  /  3632 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

2黑马币
/*
2016年1月21日17:01:21
目的:指针也就是地址的运算:
      只能参与减法运算。
*/
# include <stdio.h>

int main(void)
{
        int a = 3;
        int b = 5;
        int * p;
        int * q;
        int c;
        p = &a;
        printf("a的地址为%#x\n", p);
        q = &b;
        printf("b的地址为%#x\n", q);
        //c = p / q;//error:除号左边和右边都不能有指针类型变量或者是常量
        //c = p * q;//error:乘号左边和右边都不能有指针类型变量或者是常量
        //c = p + q;//error:cannot add two pointers.
        c = (p - q);
        printf("p - q = %d\n", c);//A
        c = (q - p);
        printf("q - p = %d\n", c);//B
        c = 0x19ff3c - 0x19ff38;
        printf("%d\n", c);//C
        c = 0x19ff38 - 0x19ff3c;
        printf("%d\n", c);//D


        return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
a的地址为0x19ff3c
b的地址为0x19ff38
p - q = 1
q - p = -1
4
-4
————————————
*/
为什么A行和C行的输出结果会不一样,一个是1,一个是4?

最佳答案

查看完整内容

1 .首先楼主要明确 一个int类型的内存单元的大小是4个字节 2 .两个指针变量相减得到的是两个连续的内存单元之间相差的单元个数 3 当直接用内存地址相减楼主得到结果是4 ,那么由上述1可知两个结果意义上是等价的。

3 个回复

倒序浏览
本帖最后由 野火 于 2016-1-23 01:42 编辑

1  .首先楼主要明确 一个int类型的内存单元的大小是4个字节

2 .两个指针变量相减得到的是两个连续的内存单元之间相差的单元个数

3 当直接用内存地址相减楼主得到结果是4 ,那么由上述1可知两个结果意义上是等价的。
回复 使用道具 举报
这个问题是这样的:
在您的代码中, 开始 c = (p - q) 计算的是两个变量(p和q)的减法, 这两个变量是整型指针变量,这个减法类似于两筐苹果减去一筐苹果还剩一筐苹果,  但   c = 0x19ff3c - 0x19ff38 计算的是两个十六进制数字的减法 ( 在你理解看来是计算两个变量在内存中的位置距离, 但它是以内存中的字节数进行计算的),再用刚才的例子是计算两个苹果减去一个苹果还剩一个苹果. 其实这个问题类似于数学计算中单位的问题, 变量减法要用变量的单位进行.
回复 使用道具 举报
感谢解答。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马