指针是指向某一个类型(内置的或者自定义的)的对象的变量。
通常我们说的“指针”,意指它所指向的对象的地址,也就是“指针的值”;
但是指针本身也是变量,也对应内存中的一块地方,因此“指针的地址”就是存储这个指针变量的内存的地址;
结合代码来看:
/************************************************************************* > File Name: newd.cpp > Author: zeyuhu > Mail: [email protected] > 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; }
输出
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)。
这也表明:涉及到指针成员的类之间的拷贝不能仅做指针(也就是指针的值)的浅拷贝,因为很容易造成同一处空间被释放多次的错误。
还有,如果使用指针参数作为函数的形参,那么,只要不手动释放该指针所指向的空间,那在调用过程中,针对形参指针的操作不会对原实参指针有任何影响,因为它只是原指针(指针的值)的一个拷贝而已。
时间: 2024-10-05 09:53:05