一、变量

  1. 变量的存放位置

image.png

  1. 全局变量 Global
  2. 静态变量 Static

二、指针与引用

1. 指针 Pointer

// 指针的定义
string s = "hello";
string* ps;

// 指针的赋值
ps = &s;

// 使用指针获取对象
(*ps).length();

// 使用指针调用对象的方法
ps->length();

2. 引用 Reference

  1. 引用相当于为原变量起一个别名,在使用上与原变量差别不大

  2. 引用必须在初始化时完成与原变量的绑定,此后不能修改绑定关系

    char c;
    
    // 定义指针
    char* p = &c;
    
    // 直接定义引用
    char& r = c;
    
    // 在函数的参数表中定义引用,当相应的函数被调用时,引用进行初始化
    void f (int& x);
    f(y);
    
  3. const 类型的引用,绑定的对象必须是左值(Lvalue)

    void f (int& x);
    f (i * 3);    // 该句会报错,因为 (i * 3) 是右值
    
  4. 没有指向引用的引用,因为引用和引用的引用都指向原变量

  5. 没有指向引用的指针,但可以有指向指针的引用

    int&* p;            // illegal
    void f(int*& p);    // OK
    
  6. 指针与引用的比较

    Pointer Reference
    独立于绑定的对象,可以不进行初始化 依赖于绑定的对象,必须进行初始化
    可以修改绑定的对象 不可修改绑定的对象
    可以设置为 NULL 不可设置为 NULL

三、动态分配内存

  1. new 用于分配内存空间并返回一个指针,该指针是访问这一块内存空间的唯一方式,与 malloc 相对应
  2. delete 用于将内存空间回收到内存池,与 free 相对应
  3. newdelete 可以保证构造函数 / 析构函数的正确调用,而 mallocfree 不调用构造函数 / 析构函数