1.指针的地址和指针上储存的地址。
指针是储存地址的变量,而指针自身也有自己的地址。
#include <iostream>
using namespace std;
int main()
{
int *p, a;
p = &a; //将a的地址赋值给p,此时p储存a的地址
cout << "指针p的地址:" << &p << endl;
cout << "指针p储存的地址:" << p << endl;
cout << "a的地址:" << &a << endl;
return 0;
}
运行结果:
指针p的地址:0012FF44
指针p储存的地址:0012FF40
a的地址:0012FF40
2.给指针动态分配/回收内存:
通过new可以给指针p动态分配一片内存空间,此时p储存的地址就是该片内存空间的首地址。通过delete可以回收该空间。这些是简单的问题,值得注意的是,通过new给指针p动态分配一片内存空间会修改p的值(p的值即p储存的地址)。
#include <iostream>
using namespace std;
int main()
{
int *p1, a;
p1 = &a; //将a的地址赋值给p,此时p储存a的地址
cout << "p1储存的地址:" << p1 << endl;
p1 = new int;
cout << "p1储存的地址:" << p1 << endl;
return 0;
}
运行结果:
p1储存的地址:0012FF40
p1储存的地址:00320708
所以在编程时要留意,当为指针p动态分配一片内存空间时,p原来所储存的值会丢失!比如上面例程中如果还利用p去获得a的值就会出错!
3.程序:
#include <iostream>
using namespace std;
struct A
{
int x;
A *link;
};
int main()
{
struct A *a = new A, *b = new A; //分别记a,b分配得的内存空间为ma,mb
cout << "原地址:" << endl;
cout << "a:" << a << " " << &(a ->x) << " " << a ->link << endl;
cout << "b:" << b << " " << &(b ->x) << " " << b ->link << endl;
a = b; //此时a和b储存的地址一样,都是mb的首地址
//而a原来储存的地址丢失,也就是说a不再指向ma这片内存空间,而指向mb
cout << "更新后地址对比:" << endl;
cout << "a:" << a << " " << &(a ->x) << " " << a ->link << endl;
cout << "b:" << b << " " << &(b ->x) << " " << b ->link << endl;
return 0;
}
运行结果:
原地址:
a:003606D0 003606D0 CDCDCDCD
b:00360708 00360708 CDCDCDCD
更新后地址对比:
a:00360708 00360708 CDCDCDCD
b:00360708 00360708 CDCDCDCD
可以看到,b的地址始终没有变,但a变了。而且观察还可以发现,其实a、b储存的地址(亦即ma,mb的首地址)就是各自的x的地址。
4.当使用new为指针p申请一片内存空间时,可以同时初始化这片内存区域。典型的方式如下:
#include <iostream>
using namespace std;
int main()
{
int *i;
char *c;
bool *b;
i = new int(1);
c = new char('#');
b = new bool(0);
cout << *i << " " << *c << " " << *b << endl;
return 0;
}
运行结果:
1 # 0
这种方式对于int,char等基本数据类型是可以直接使用的,但如果指针类型是结构体类型,就要使用拷贝构造函数。
5.动态分配内存时指针本身所占空间不变
#include <iostream>
using namespace std;
int main()
{
int *p;
cout << sizeof(p) << endl;
p = new int[100]; //开辟一段可以存放一维整型数组(大小为100)的内存空间并返回其首地址
cout << sizeof(p) << endl;
return 0;
}
运行结果:
4
4
p = new int[100]这一步操作只是让p指向一片大小为100*sizeof(int)的内存空间,就是说让指针p储存这一段空间的首地址,而p本身所占用的空间大小是不会变的。
6.对于指针p1和p2,给p1动态分配一段内存空间,再令p2 = p1,那么p2和p1指向同一片内存空间,相当于给p2也动态分配一片内存空间。
#include <iostream>
using namespace std;
struct Pos
{
int x;
Pos(){x = 3;}
};
int main()
{
Pos *p1, *p2;
p1 = new Pos;
cout << "初状态:" << endl;
cout << "p1储存的地址:" << p1 << endl;
cout << "p2储存的地址:" << p2 << endl;
cout << "p2->x = " << p2->x << endl;
p2 = p1;
cout << endl << "赋值后:" << endl;
cout << "p1储存的地址:" << p1 << endl;
cout << "p2储存的地址:" << p2 << endl;
cout << "p2->x = " << p2->x << endl;
return 0;
}
输出:
初状态:
p1储存的地址:0x3e3e58
p2储存的地址:0x4134e6
p2->x = 1527825539
赋值后:
p1储存的地址:0x3e3e58
p2储存的地址:0x3e3e58
p2->x = 3