指针总结

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值