C++指针与引用的区别
C++指针与引用的区别 指针和引用是C++语言中两种不同的概念,初学者容易把它们混淆一起。这两种概念都是地址的概念,但它们有很多不同的特点和应用场景。 相同点 1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。 不同点 1. 指针是一个实体,而引用仅是个别名;指针是一个变量,它存储了某个内存地址,而引用只是一个别名,它本身不占用内存空间。 2. 引用使用时无需解引用(*),指针需要解引用;在使用指针时,需要使用解引用符号(*)来获取指针所指向的内存地址,而引用可以直接使用。 3. 引用只能在定义时被初始化一次,之后不可变;指针可变;引用一旦被初始化,就不能改变它的关系,而指针可以随时改变所指的对象。 4. 引用没有 const,指针有 const,const 的指针不可变;const 是一个关键字,用于限定变量的值不可改变。 5. 引用不能为空,指针可以为空;引用必须与合法的存储单元关联,而指针可以为空,也可以指向某个无效的内存地址。 6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;sizeof 是一个运算符,用于获取变量或类型的大小。 联系 1. 引用在语言内部用指针实现;引用是 C++ 中的一种语法糖,实际上它是使用指针实现的。 2. 对一般应用而言,把引用理解为指针,不会犯严重语义错误。引用是操作受限了的指针(仅容许取内容操作)。 引用规则 1. 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化); 2. 不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL); 3. 一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。 示例程序 int m; int &n = m; n 相当于 m 的别名(绰号),对 n 的任何操作就是对 m 的操作。 传递函数的参数和返回值 C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。 值传递 void Func1(int x){x = x + 10;} int n = 0; Func1(n); cout << “n = ” << n << endl; // n = 0 指针传递 void Func2(int *x){(* x) = (* x) + 10;} int n = 0; Func2(&n); cout << “n = ” << n << endl; // n = 10 引用传递 void Func3(int &x){x = x + 10;} int n = 0; Func3(n); cout << “n = ” << n << endl; // n = 10 为什么需要引用 答案是“用适当的工具做恰如其分的工作”。指针能够毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险。如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。