0

这是一个指针算术问题

    //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

4

2 回答 2

1

首先,您要减去指针,而不是取消引用的指针。如果您希望通过指针减去afrom的值b,则需要使用*pand *q

对于编写的代码,实际上并不能保证这里会输出什么。换句话说,没有单一的“正确”答案。您正在获取两个自动分配的变量的地址。编译器可以将它们放在任何它想要的地方,因此不能保证它们之间的距离。

但通常情况下,编译器会将它们放在堆栈上,彼此相邻。所以如果你减去他们的地址,你通常会得到 1 或 -1。

请注意,指针的类型是int*,因此对它们的指针算术不会以字节为单位(也许这是您所期望的?),而是以sizeof(int).

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

于 2020-05-21T10:01:22.737 回答
0
int c = p - q;

您减去指针的值p及其q本身 - 实际上是内存中的地址,a并将b结果分配给int c.

如果你想用 ( ) 减去值( 20) a,你需要解引用指针并通过操作符来获取它们指向的对象的值。50bpq*

改为使用int c = *p - *q;


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

  1. 在大多数情况下, Anint无法保存内存位置的编号。分配超出范围的数字会int调用未定义的行为。要存储内存地址的编号,您至少需要一个long int.

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


您需要定义cas of typelong 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都不b需要随后存储在内存中。sizeof(int)并不总是 4,尽管它在大多数现代实现中很常见。

于 2020-05-21T10:00:56.203 回答