• 6.数组、指针


    一、数组:

    数组名字数组首元素的内存地址,实质是一个指针常量,不能被赋值。

    多维数组要转化为一维方式存储,(计算机内存是一维编址的),越右边的下标变化越快

    数组名作参数,传送的是数组首地址,对形参数组元素值的改变,会影响到实参。

    对象数组:类名 数组名[常量表达式] 访问:数组名[…].成员名

    二、指针:

    内存空间的访问方式:①通过变量名直接访问 ②通过地址间接访问

    指针:用于存放内存单元地址的变量类型,用于间接访问内存。

    指针变量:指针类型的变量,用于存放地址的变量。

    指针数组:例如:int *p[3];每个元素都是指针变量。

    指向常量的指针:const int *p1不能通过指针来改变所指对象的值,但指针本身能改变。例如int a, b; const int *p = &a; p = &b;√ *p = 10;×

    指针类型的常量:int * const p2 指针本身的值不能改变。

    指针型函数:返回值是指针(把大量数据返回主调函数)。

    指向函数的指针:例如int(*p)(float); (float处为形参表) (数据指针指向数据存储区,函数指针:程序代码存储区)。

    对象指针:

    例如:Point a(4,5); Point *p = &a; p->getX();通过对象指针,可以访问到对象的公有成员。

    this指针。。

    指向类的非静态成员的指针。。。

    指向类的静态成员的指针(访问不依赖对象,通过普通指针)

    三、动态内存分配:

    堆对象:在程序运行过程中申请和释放的存储单元

    建立和删除堆对象使用两个运算符:new和delete(不用会导致内存泄漏)

    动态管理数组类型对象:

    例如int *p = new int[10]; …… delete[]p;

    Int *p1 = new int[10][5]; (p和p1中10处可以用变量,而p1的其他维比如5那要求是常量)

    注意:char(*p)[3][4]; int i = 2; p = new char[i][3][4]为产生指向3*4的二维char型数组的指针,char(*p1)[3]; p = new char[2][3]; 为指向一维数组的指针

    四、当类的数据成员中有指针类型时要注意别用浅复制而要用深复制。

    因为用浅复制调用默认构造函数,实现对应数据项的直接复制,两个对象的指针指向的是同一个内存地址,并没有形成真正的副本。两个对象共用了同一块内存空间,该空间被两次释放,会导致运行错误。

    再补充两个运算符:

    *:①声明时:int *p; 声明时是指针

    ②执行 或 声明语句的初始化表达式中: cout << *p; 或 int a = *p; 表示访问指针所指对象的内容

    &:①声明时:int i; int &r = i 声明的是引用

    ②执行 或 给变量赋值时出现在等号右边:

    cout << &r; 或 int a; int *p = &a;表示取对象的地址。

  • 相关阅读:
    Codeforces 931A&1312A&172A
    STL常用容器(deque&stack&queue)
    Codeforces 141A&1368A
    Tensorflow安装和配置
    Spark高可用配置
    Spark安装及环境配置
    SSH免密登录
    大数据集群linux环境搭配
    Spark学习之RDD算子
    Spark学习之再谈RDD
  • 原文地址:https://www.cnblogs.com/GraceSkyer/p/6230739.html
Copyright © 2020-2023  润新知