代码改变世界

指针相减-堆和栈结果不同

2012-12-11 22:25  kennyMc  阅读(299)  评论(0编辑  收藏  举报
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main()
{
    int *p;
    int *p1;
    int i=10;
    int j=20;
    p=&i;
    p1=&j;
    cout<<"指针指向栈空间"<<endl;
    cout<<"p:"<<p<<" *p:"<<*p<<endl;
    cout<<"p1:"<<p1<<" *p1:"<<*p1<<endl;
    *p=p1-p;//注意这里p1-p返回的是int类型
    cout<<"p:"<<p<<" *p:"<<*p<<endl;
    p=p1=0;
    cout<<"指针指向堆空间"<<endl;
    p=new int(10);
    p1=new int(20);
    cout<<"p:"<<p<<" *p:"<<*p<<endl;
    cout<<"p1:"<<p1<<" *p1:"<<*p1<<endl;
    *p=p1-p;//注意这里p1-p返回的是int类型
    cout<<"p:"<<p<<" *p:"<<*p<<endl;
    delete p;
    delete p1;
    return 0;
}

输出结果:

能够看出,在栈上分配的变量内存是连续的,指针相减得到的是两地址差/变量类型,这里p和p1地址相距4,p1-p=-4,类型是int,32位cpu上是4个字节,所以结果是-1。

而通过new关键在在堆上分配的内存之间是不连续的,堆不像栈,栈先进后出,是连续的,所以这里p和p1地址相距就不是4。

本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。