`

C++中的 引用和指针区别

c++ 
阅读更多

 

引用是C++中的概念,初学者容易把引用和指针混淆一起。
一下程序中,n是m的一个引用(reference),m是被引用物(referent)。
int m;
int &n = m;
n相当于m的别名(绰号),对n的任何操作就是对m的操作。
所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。

引用的规则:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

以下示例程序中,k被初始化为i的引用。
语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。
由于k是i的引用,所以i的值也变成了6。
int i = 5;
int j = 6;
int &k = i;
k = j; // k和i的值都变成了6;

引用的主要功能是传递函数的参数和返回值。

C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

以下是"值传递"的示例程序。

由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n, 所以n的值仍然是0。
void Func1(int x)
{
x = x + 10;
}
...
int n = 0;
Func1(n);
cout << "n = " << n << endl; // n = 0

以下是"指针传递"的示例程序。

由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n的值改变,所以n的值成为10。
void Func2(int *x)
{
(* x) = (* x) + 10;
}
...
int n = 0;
Func2(&n);
cout << "n = " << n << endl; // n = 10

以下是"引用传递"的示例程序。

由于Func3函数体内的x是外部变量n的引用,x和n是同一个东西,改变x等于改变n,所以n的值成为10。
void Func3(int &x)
{
x = x + 10;
}
...
int n = 0;
Func3(n);
cout << "n = " << n << endl; // n = 10

对比上述三个示例程序,会发现"引用传递"的性质象"指针传递",而书写方式象"值传递"。

实际上"引用"可以做的任何事情"指针"也都能够做,为什么还要"引用"这东西?
答案是"用适当的工具做恰如其分的工作"。

指针能够毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险。

如果的确只需要借用一下某个对象的"别名",那么就用"引用",而不要用"指针",以免发生意外。

 

引用就是传递的原始变量,指针传递的是变量的地址,两者没什么关系,

引用主要用于函数参数的传递,相对于传值,可以节省内存空间,
指针可以直接传递变量地址,也可以可以节省内存空间,但是指针功能强大一些,可以在自由操作数组变量

分享到:
评论
1 楼 eric_weitm 2012-04-11  
在效率本身上而言,引用也有优势。另外,在编译器实现时,指针的传递实际上也是传值,只不过这个值是指针变量的值而不是一般变量的值,在操作数据时使用的指令不是直接寻址,而是间接寻址。编译器要实现引用,就要维护变量的作用域,即将某个变量符号映射成真正的被引用变量的地址,这样调用栈的栈帧中是不用分配实参的空间的。

相关推荐

    C++指针与引用的区别

    详细分析了指针与引用的区别,适合初学者了解

    C++引用&和指针在作为形参时的区别

    C++引用&和指针在作为形参时的区别 int n; int &m = n; 在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,...

    C++引用和指针的区别,C++虚函数原理,C++面试经验

    介绍了引用和指针的区别,C++虚函数原理,C++面试经验。

    C++重要的谨记指针和引用的区别

    C++重要的谨记指针和引用的区别,学好C++。

    c++中指针和引用的区别

    指针和引用的区别,C++中指针和引用,初学者容易混淆。

    C++ 中引用与指针的区别实例详解

    C++ 中引用与指针的区别实例详解 引用是从C++才引入的,在C中不存在。为了搞清楚引用的概念,得先搞明白变量的定义及引用与变量的区别,变量的要素一共有两个:名称与空间。  引用不是变量,它仅仅是变量的别名,...

    C++指针与引用

    C++指针与引用,专门讲述c++中指针与引用的区别与使用。

    C++对象和指针的引用

    在C++中,可以说明指向类的数据成员和成员函数的指针。 指向数据成员的指针格式如下: &lt;类型说明符&gt;&lt;类名&gt;::*&lt;指针名&gt; 指向成员函数的指针格式如下: &lt;类型说明符&gt;(&lt;类名&gt;::*&lt;指针名&gt;)(&lt;参数表&gt;) 例如,...

    c++中引用和指针的区别和联系

    C++中的引用和指针 ★ 相同点: 1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名(java中的引用其实也是别名的意思)。 ★ 区别: 1. 指针是一个实体,而引用仅是个别名;2. ...

    浅析C++中的引用与指针

    指针和引用是c++中的一个重要概念,在学习c++语言过程中,深刻理解指针和引用的本质是必不可少的本文通过举例子,作比较等方法,阐述c++程序设计中引用与指针的区别与联系,揭示引用的本质以及使用引用的好处。

    C++中的对象和引用

    详细的讲解了C++中的引用和函数的重载的知识,引用和指针的区别,引用的实质,以及在使用引用时的注意事项,以及常引用的用法。

    指针传递和引用传递的区别

    详细介绍了C++中通过指针和通过引用传递参数的区别

    C++ 解环引用智能指针

    4、 可以管理用new分配的内存块中的部分内存空间,即可以替代C++引用,并且保证内存正常释放,如: class A{}; class B{public: A a;}; shared_ptr&lt;B&gt; pb=new(ydsh,(B*)0) B; shared_ptr&lt;A&gt; pa=&pb-&gt;a; 5、 ...

    c++指针和引用的使用浅谈

    通过数个例子,很清晰的比较了C++中指针与应用的用法和区别。

    c++高阶指针与引用的实例(有代码)

    该文档给出两个关于c++高阶指针与引用的应用实例,是一个非常不错的C++学习资源!

    C# 调用C++DLL(函数参数包含指针)

    C#调用C++DLL,C++DLL中的函数参数包含指针。 绝对可用。

    C++ 中引用和指针的关系实例详解

    主要介绍了C++ 中引用和指针的关系实例详解的相关资料,需要的朋友可以参考下

    C++指针和引用

    讲述C++指针和引用的用法,适合刚学的学子们

    c++指针和引用

    c++指针和引用教程,很详细很清晰,适合初学者使用

Global site tag (gtag.js) - Google Analytics