liuhw598 发表于 2016-12-1 12:05:52

两指针变量相减

两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址) 相减之差再除以该数组元素的长度(字节数)。例如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 = {1, 2, 3, 4, 5};
        float arr2 = {1, 2};
        int ret = arr1 - arr2;
        printf("%d\n", ret);

        return 0;
}

根据这句话,无论arr1的元素个数是多少,为什么ret的结果都是4呢?

四十二 发表于 2016-12-1 22:38:04

个人猜测哦:

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

致年轻的我们 发表于 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;
}

致年轻的我们 发表于 2016-12-1 23:13:09

四十二 发表于 2016-12-1 22:38
个人猜测哦:

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

本来想点支持,点成了反对,抱歉哈

xieglt 发表于 2016-12-2 12:20:46

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

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

青云风力 发表于 2016-12-3 00:41:55

图示是我的平台的结果(win10,gcc4.9.2)
页: [1]
查看完整版本: 两指针变量相减