码迷,mamicode.com
首页 > 其他好文 > 详细

区别<指针、指针的地址、指针的值>

时间:2014-10-11 18:32:45      阅读:433      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   使用   数据   sp   

指针是指向某一个类型(内置的或者自定义的)的对象的变量。

通常我们说的“指针”,意指它所指向的对象的地址,也就是“指针的值”;

但是指针本身也是变量,也对应内存中的一块地方,因此“指针的地址”就是存储这个指针变量的内存的地址;

结合代码来看:

/*************************************************************************
    > File Name: newd.cpp
    > Author: zeyuhu
    > Mail: zeyu.hu@ansys.com 
    > Created Time: Sat 11 Oct 2014 02:36:53 PM CST
 ************************************************************************/

#include<iostream>
using namespace std;

class A
{
    public:
        A(int *_p):p(_p)
    {

    }
        int *p;
};
int main()
{
    int *b = new int[2];
    b[0] = 1000;
    b[1] = 1001;
    A *a = new A(b);

    cout<<a->p<<endl;
    cout<<&(a->p)<<endl;
    cout<<*(a->p)<<endl;

    cout<<endl;

    cout<<a<<endl;
    cout<<&a<<endl;

    delete a;
}

输出

bubuko.com,布布扣

a->p :指针的值。即A类型对象*a的成员变量(指针p)的值,因为p本身也是一个指针,所以可以用*(a->p)取得值1000;

&(a->p):指针的地址。p作为对象*a的一个成员变量,有一个在对象a被构造时分配的内存地址。我们注意到这个地址和后面对象a本身的地址相同,因为p是A的第一个数据成员。

a:指针的值。a是一个指向A类型对象的指针,a的值是该对象在内存中的地址。

&a:指针的地址。注意到,因为a指向的对象所在的内存空间是堆空间,但是a本身却是存储在栈中的一个指针变量,所以a是堆地址,而&a则是栈地址。

 

另外的分析:如果类中有指针类型的数据成员,而且它们指向的空间是用new手动分配的,那么,如果不手动去释放,那么这些空间是无法自动释放的。因为类默认的析构只能将栈中的变量(例如上面的p)清空(置0)。

这也表明:涉及到指针成员的类之间的拷贝不能仅做指针(也就是指针的值)的浅拷贝,因为很容易造成同一处空间被释放多次的错误。

还有,如果使用指针参数作为函数的形参,那么,只要不手动释放该指针所指向的空间,那在调用过程中,针对形参指针的操作不会对原实参指针有任何影响,因为它只是原指针(指针的值)的一个拷贝而已。

区别<指针、指针的地址、指针的值>

标签:style   blog   http   color   io   os   使用   数据   sp   

原文地址:http://www.cnblogs.com/zeyuhu/p/4019202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!