鱼C论坛

 找回密码
 立即注册
查看: 4206|回复: 5

两指针变量相减

[复制链接]
发表于 2016-12-1 12:05:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址) 相减之差再除以该数组元素的长度(字节数)。例如pf1和pf2 是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。两个指针变量不能进行加法运算。 例如, pf1+pf2是什么意思呢?毫无实际意义。

#include <stdio.h>
int main()
{
        float arr1[5] = {1, 2, 3, 4, 5};
        float arr2[2] = {1, 2};
        int ret = arr1 - arr2;
        printf("%d\n", ret);

        return 0;
}

根据这句话,无论arr1的元素个数是多少,为什么ret的结果都是4呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-1 22:38:04 | 显示全部楼层
个人猜测哦:

数组名是指针,指针定义为浮点四个字长,相邻声明的指针变量间隔为四个字长,分别指向存储区的不同数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2016-12-1 23:12:13 | 显示全部楼层
虽然结果为4,实际上它们地址值相差不是4
#include <stdio.h>
int main()
{
        float arr1[] = {1, 2, 3, 4, 5};
        float arr2[] = {1, 2};
        int ret = arr1 - arr2;
        printf("%d %d %d \n",ret,arr1,arr2);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-1 23:13:09 | 显示全部楼层
四十二 发表于 2016-12-1 22:38
个人猜测哦:

数组名是指针,指针定义为浮点四个字长,相邻声明的指针变量间隔为四个字长,分别指向存储 ...

本来想点支持,点成了反对,抱歉哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-2 12:20:46 | 显示全部楼层
临时变量是在栈上分配的空间,
编译器怎么分配的空间我们无法准确知道.
所以,你的 addr1 - add2 这种写法 也是没有任何意义的.
addr1 可能 比 add2 大,也可能比add2 小
它们可能是连续的内存空间,也有可能不连续。
用VC编译可能是这个结果,换成GCC可能就是另外一个结果

有意义的写法有:
ret = &addr1[4] - addr1;  
ret = sizeof(float) * 5;

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-3 00:41:55 | 显示全部楼层
图示是我的平台的结果(win10,gcc4.9.2)
11111111111111.png
222222222222222.png
3333333333333333.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 18:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表