任何人都可以解释为什么我在这里得到1吗?

时间:2020-05-21 09:56:20

标签: c++ pointers memory-address pointer-arithmetic pointer-conversion

这是一个指针式的数学问题

    //code   
    #include<iostream>
    using namespace std;
    int main()   
    {
        int a=20,b=50,*p,*q;     
        p=&a;
        q=&b;
        int c=p-q;
        cout<<c;   //Here I'm getting 1 for all positive  value of 'a' and 'b'
        return 0;   
    }

我也尝试了long int c

2 个答案:

答案 0 :(得分:1)

首先,您要减去指针,而不是取消引用的指针。如果希望通过指针从z=input('Does the creature have gills? ') if z==('yes') or ('yeah'): print ('It is a fish!') elif z=='no': print('The creature is not a fish.') 中减去a的值,则需要使用b*p

对于编写的代码,实际上不保证将在此处输出什么。换句话说,没有单一的“正确”答案。您正在获取两个自动分配的变量的地址。允许编译器将它们放在任意位置,因此不能保证它们分开的距离。

不过,通常情况下,编译器会将它们并排放置在堆栈中。因此,如果减去它们的地址,则通常以1或-1结尾。

请注意,指针的类型为*q,因此指针上的指针算术将不是 以字节为单位(也许正是您所期望的?),而是{ {1}}。

还要注意,根据标准,内存“对象”之外的指针算术并不是严格定义好的(请参阅“未定义的行为”),尽管大多数实现(编译器)都不会因为这种类型的行为而对您不利直接进行“距离”测量,因为它通常用于实现树数据结构等。 (至少在具有线性地址空间的现代平台上。)

答案 1 :(得分:0)

int c = p - q;

您减去指针pq本身的值-实际上是存储器中ab的地址,并将结果分配给{{1} } int

如果要将值c20)减去a50),则需要取消引用指针b和{{ 1}}由p运算符获取它们指向的对象的值。

改为使用q


如果要减去指针本身的值,则需要考虑以下几点:

  1. 在大多数情况下,*不能保存存储位置的编号。分配一个超出int c = *p - *q;范围的数字将调用undefined behavior。要存储内存地址的编号,至少需要一个int

  2. 减法是由指针类型本身进行的。因此,int的结果。


您需要将long int定义为1类型,并将两个指针都转换为c

long int

输出:

long int

请注意,对象#include <iostream> using namespace std; int main (void) { int *p, *q; int a = 20, b = 50; p = &a; q = &b; long int c = (long int) p - (long int) q; cout << c; } 4 (at my execution) 都不需要随后存储在内存中。 a并不总是4,尽管在大多数现代实现中都很常见。