为什么两个指针之间的差异不等于类型的大小?

Max*_*Max 0 c++ memory pointers memory-layout visual-studio-2015

我有简单的程序:

#include <iostream>

using namespace std;


int main()
{
    int a = 5;
    int b = 6;
    int* p1 = &a;
    int* p2 = &b;
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;

    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

00DBF9B8 00DBF9AC ,sizeof(int)=4
Run Code Online (Sandbox Code Playgroud)

但是,00DBF9B8 - 00DBF9AC == ?.我无法理解这个结果.

如果我像这样修改程序:

#include <iostream>

using namespace std;


int main()
{
    static int a = 5;
    static int b = 6;
    int* p1 = &a;
    int* p2 = &b;
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;

    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到了正确的结果:

00394000 00394004 ,sizeof(int)=4
Run Code Online (Sandbox Code Playgroud)

Ste*_*ner 5

无法保证将局部变量(甚至静态变量)放在连续的内存地址上.实际上,如果你减去两个没有指向同一个数组的指针值,它将是未定义的行为.

但你可以使用指针算术如下:

int main()
{
    int a;
    int* p1 = &a;
    int* p2 = p1+1;
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,单个整数值可以被视为大小为1的数组,p1+1因此指向"数组的最后一个元素之后的一个",这样操作p2 = p1+1实际上是有效的(p2当然,取消引用当然不会有效) .