指针与引用

320 阅读3分钟

一、const修饰指针

1.常量指针(pointer to const)

 int a=10;
 const int *p=&a;
 特点:指针的指向可以修改,但是指针指向的值不可以修改

2.指针常量(const pointer)

 int a=10;
 int * const p=&a;
 特点:指针的指向不可以修改,但是指针指向的值可以修改

3.const既修饰指针又修饰常量

 int a=10;
 const int * const p=&a;
 特点:指针的指向不可以修改,指针指向的值也不可以修改

二、const修饰引用

1.关于引用与指针的区别

  • 永远不要使用一个指向空值的引用,一个引用必须始终指向某个对象.因为引用肯定要指向一个对象,所以,在C语言里引用必须被初始化。
  • 它们功能看过去很相似,就是都是间接引用某个对象,但是指针与引用的另一个重要的 不同是指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向在初始化时被指 定的对象以后不能改变。类似于绑定在了一起。
  • 重载某个操作符时你应该使用引用。最普通的例子是重载操作符[]。这个操作符典型的 用法是返回一个目标对象其能被赋值。
  • 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高,因为在使 用引用之前不需要测试它的合法性。

2.指向常量的引用(reference to const),没有const reference因为引用本身就是指针常量(const pointer)

使用

// 类
class A
{
private:
const int a; // 常对象成员,只能在初始化列表赋值

public:
// 构造函数
A() : a(0) { };
A(int x) : a(x) { }; // 初始化列表

// const可用于对重载函数的区分
int getValue(); // 普通成员函数
int getValue() const; // 常成员函数,不得修改类中的任何数据成员的值
};

void function()
{
// 对象
A b; // 普通对象,可以调用全部成员函数、更新常成员变量
const A a; // 常对象,只能调用常成员函数
const A *p = &a; // 指针变量,指向常对象
const A &q = a; // 指向常对象的引用

// 指针
char greeting[] = "Hello";
char* p1 = greeting; // 指针变量,指向字符数组变量
const char* p2 = greeting; // 指针变量,指向字符数组常量(const 后面是 char,说明指向的字符(char)不可改变)
char* const p3 = greeting; // 自身是常量的指针,指向字符数组变量(const 后面是 p3,说明 p3 指针自身不可改变)
const char* const p4 = greeting; // 自身是常量的指针,指向字符数组常量
}

// 函数
void function1(const int Var); // 传递过来的参数在函数内不可变
void function2(const char* Var); // 参数指针所指内容为常量
void function3(char* const Var); // 参数指针为常量
void function4(const int& Var); // 引用参数在函数内为常量

// 函数返回值
const int function5(); // 返回一个常数
const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6();
int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7();
//引用与指针的区别
string& rs;      // 错 误 引 用 必 须 被 初 始 化
string s("xyzzy");
string& rs = s; // 正 确 rs 指 向 s
string *ps; // 未 初 始 化 的 指 针
          // 合 法 但 危 险
void printDouble(const double& rd)
{
    cout << rd;    // 不 需 要 测 试 rd,它
}                   // 肯 定 指 向 一 个 double 值  
void printDouble(const double *pd)
   {
       if (pd) {    // 检 查 是 否 为 NULL
           cout << *pd;
       }
   }
string s1("Nancy");
   string s2("Clancy");
   string& rs = s1; // rs 引 用 s1
   string *ps = &s1; // ps 指 向 s1
   rs = s2; // rs 仍 旧 引 用 s1,
           // 但 是 s1 的 值 现 在 是
          // "Clancy"
   ps = &s2; // ps 现 在 指 向 s2;
             // s1 没 有 改 变