第八章 指针

第八章 指针

2.  用指针来保存地址

☆指针就是保存内存地址的无符号整数变量

指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。32位系统下寻址能力(地址空间)是4G-byte(0~2^32-1)二进制表示长度为32bit(也就是4B)。64位系统下寻址能力(地址空间)是8G-byte(0~2^64-1)二进制表示长度为64bit(也就是8B)。

int a=1;

int *p=&a;等价于int  *p;p=&a;

 p是a的地址,*P是取此处地址的值

1.  空指针

将一个没有赋初值的指针delete,将会出现系统崩溃

☆定义指针后必须要对其初始化int *p=NULL;或被赋值int *p;p=0;

 0(NULL)既能是int型也可以是int *型(地址类型) 所以0常常用于指针的初始化int *p=0;此时的0代表地址为00000000的地址,并且这个地址不存储任何数据。我们大可以对它进行任意的操作。

☆删除指针也要将他指向NULL;

delete p;

p=NULL;

4.  指针与类型

不能将不同类型指针(地址)相互赋值,因为不同类型的指针运算方式不同;

6.  容易混淆的概念

p的值(p)≠p的地址(&p)

一个是存储的别人地址一个是自己的地址

7.  指针对数值的操作

typedef unsigned short int ut;

8.  更换指针保存的地址

和变量一样指针也可以更换其保存的地址

☆9.1.  为什么使用指针

1.处理中存放的大型数据

2.快速访问类的成员数据和函数

3.以别名的方式向函数传递参数(按址传递①改变实参的值②得到多个返回值)

堆中数据的优点:

①安全(只能通过指针来访问这些匿名的数据)②程序员可以控制这些数据的寿命

9.4.  指针与堆

 int *p=new int();

当内存不够的时候,new会返回一个0(空指针);

9.5.    用指针删除堆中空间

☆声明了一个堆内存,就必须记得将他释放!

一般来说用于指向堆中内存的指针是个局部变量(存储在栈中),在程序结束并返回时,该指针就会自动消失。如果不提前delete或转移该地址,就会出现内存泄露(即内存遗落)

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int *p=new int;//堆的申请
 6     *p=360;
 7     cout<<*p<<endl;
 8     delete p;
 9     //cout<<*p<<endl;//不可以使用
10     //delete p;//连着两个delete系统就会崩溃,这是因为p指针指向的内存已经释放,再次释放就会导致系统崩溃
11     p=0; //必须使用,delete之后的未知堆中数据容易出错 注意 这个不是赋值而是将变量p的设为空指针(此处没体现这个必要性,但这是一个习惯,必须要养成)
12     //delete p;p=0;(必须连着使用)之后告诉编译器该指针已经回收指向空地址。
13     //要想使用这个已经声明了的指针就必须重新开辟空间(该指针还在其生命周期之内)
14     p=new int;
15     *p=8;
16     cout<<*p<<endl;
17     delete p;
18     p=0;
19     return 0;
20 }

10.  内存泄露

忘记释放指向堆中空间的指针就会出现内存泄露

11.  在堆中创建对象

Human *p=new Human

 在堆中新建一个Human对象*p;该对象的地址就是p;

12.  在堆中删除对象

Human *p=new Human;

delete p;

p=NULL;

delete p会自动调用析构函数删除p指向的堆中对象; 

13.  访问堆中的数据成员

☆(*p).get();等价于p->get(); 

14.  在构造函数中开辟内存空间

15.  对象在栈与堆中的不同

对象在栈中由析构函数自动释放内存,

对象在堆中要程序员手动释放该内存。

16.  this指针

 this指针 就是系统自动创建的指向对象的指针(隐形存在的,在析构函数赋值的时候经常出现) 

☆17.  指针的常见错误

 delete p  与 p=0 必须一起用

 delete p后告诉编译器两件事:①p成了迷途指针②p指向的内存已被释放。   但是该p仍然存在且还指向这块内存,如果该内存被其它指针使用再次操作该p就会改变这个该内存的值

18.  指针运算 (即指针保存的内存地址的运算)

指针只能p++、p- -、p=p-2、p1=p2、*p=p1-p2(结果不是地址,是一个值,是两个内存地址的差)、P1>P2。

注意:因为开辟的内存不会自己改变,所以改变指针p后,p就不在指向这个内存空间。

19.1.  常量指针

int * const p (p的值不能改变,此时p只能被初始化不能被赋值)

目的在于将p与对象绑定

19.2.  指向常量的指针

const int *p

目的在于将p绑定的对象设为常量

19.3.  指向常量的常指针

const int * const p

目的在于将p与对象绑定并且将对象设为常量

以上操作都没有涉及到&p!!!

本章总结:

1.  指针是保存内存地址的变量(指针,是一个无符号整数(unsigned int))

int     a=1;                    等价于               int    a=1;

int*   p;                                                   int*  p=&a;

p=&a;

2.  ☆指针从出现到消失,都要绑定一个已知对象的地址

一般情况下,指针常与NULL(0)地址为00000000的空间绑定;p=0;/p=NULL;

3.  为什么要使用指针

①   处理堆中大型数据

②   快速访问类的成员函数和数据

③   按址传递①改变实参的值②得到多个返回值

4.  堆中数据的优点

①   安全(只能通过指针访问)②可以随时控制这些数据的寿命

5.  在堆中创建对象

human*     p=new human;

创建一个human对象并且将地址传给p,     *p就是该对象;

☆(*p).get();        等价于     p->get();

6.  this指针:每个对象都有一个系统自创的this指针

7.  ☆delete  p 。告诉编译器两件事①p指向的空间被释放②p成了迷途指针

8.  指针运算。(由其类型而定)

指针只能:p++,p--,p=p-2,p1=p2,*p=p1-p2,p1>p2

☆指针的值改变后就不再指向原来的空间了

9.  const 的使用

   int* const p;

     int const *p;     等价于     const int * p;

     int const * const p;  等价于     const int * const p;

     int get()const{x=5;return x;}

原文地址:https://www.cnblogs.com/zenseven/p/3731907.html