zoukankan      html  css  js  c++  java
  • 第八章 指针

    第八章 指针

    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;}

  • 相关阅读:
    C#+ArcEngine10.0+SP5实现鼠标移动动态显示要素属性信息
    C#中实现excel文件批量导入access数据表中
    C#子窗体闪烁问题解决
    C#打印代码运行时间
    TableLayoutPanel导致的闪屏问题
    线段余弦角+凸包算法
    ICommand相关知识
    批量导出access某表内容到word文档
    通过数组里的时间重新排序数组
    数组层级叠加
  • 原文地址:https://www.cnblogs.com/zenseven/p/3731907.html
Copyright © 2011-2022 走看看