2017-07-03 52 views
0

我有简单的程序:为什么两个指针之间的差异不等于类型的大小?

#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; 
} 

它产生以下输出:

00DBF9B8 00DBF9AC ,sizeof(int)=4 

但是,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; 
} 

我得到正确的结果:

00394000 00394004 ,sizeof(int)=4 
+7

编译器不需要一个接一个地放置局部变量 –

+1

您不能减去指向同一个数组的元素的指针,也不能指向数组后面的第一个字节。 –

+0

@SamiKuhmonen我可以创建10个变量。所有地址的“C”都不相同。 – Max

回答

5

没有保证局部变量(甚至静态变量)都放在连续的内存地址。实际上,如果您将两个不指向同一数组的指针值进行减法,那么这将是未定义的行为。

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

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

    return 0; 
} 

注意,单个积分值可以被认为是尺寸1的阵列,并且p1+1因此指向“之一的最后一个元素之后数组“,这样操作p2 = p1+1实际上是有效的(当然,取消引用p2将无效)。

相关问题