`
fireDragonpzy
  • 浏览: 460041 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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 

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

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

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

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

相关推荐

    C++指针与引用的区别

    C++指针与引用的区别 指针和引用是C++语言中两种不同的概念,初学者容易把它们混淆一起。这两种概念都是地址的概念,但它们有很多不同的特点和应用场景。 相同点 1. 都是地址的概念;指针指向一块内存,它的内容...

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

    "C++引用和指针的区别、C++虚函数原理、C++面试经验" C++ 引用和指针是两种不同的概念。虽然它们都可以用来表示内存地址,但是它们有着不同的特点和应用场景。 1. 相同点:引用和指针都是地址的概念,指针指向一块...

    C++指针与引用

    ### C++指针与引用详解 #### 指针与引用的基本概念 在C++中,指针和引用是两种非常重要的数据类型,它们都用于间接访问其他变量或对象。然而,它们之间存在显著的区别,了解这些差异对于有效、安全地使用C++语言至...

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

    其次,引用不能是NULL,总是与一个有效的对象关联,而指针可以是NULL,这提供了更多的灵活性,但也增加了潜在的陷阱。在函数调用中,如果使用指针作为参数,函数内部对指针的修改(如重新分配内存)不会影响到函数...

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

    在C++编程语言中,高阶指针和引用是两种重要的高级特性,它们极大地扩展了对内存和对象的操纵能力。本实验通过两个实例详细介绍了这两种概念及其在实际编程中的应用。 首先,我们来看第一个实例,它涉及到了二级...

    C++引用与指针问题释疑与疏证

    在C++编程语言中,引用(Reference)和指针(Pointer)是两个重要的概念,它们都用于间接访问内存中的数据。本文将详细解析这两个概念,以及在实际编程中可能出现的问题。 首先,引用是C++引入的一个特性,它类似于...

    C++数组与指针深入剖析

    ### C++数组与指针深入剖析 #### 一、引言 C++作为一种广泛使用的编程语言,其强大的功能和灵活性很大程度上得益于数组和指针的支持。数组和指针是C++编程的基础,也是理解更复杂数据结构的关键。本文将深入探讨...

    C++习题(指针和引用)[参考].pdf

    3. 指针与引用: - `double x=3.14, *p=&x;` 则`*p`等价于`x`,因为解引用`*p`会得到`x`的值。 4. 指针数组与指针: - `int *p[3];` 表示`p`是一个含有3个元素的指针数组,每个元素都是一个整型指针,即`p`是一个...

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

    我们可以使用`*`运算符来解引用指针,获取或修改它所指向的值。例如: ```cpp int x = 10; int *ptr = &x; // ptr 存储 x 的地址 *ptr = 20; // 通过指针修改 x 的值 ``` 指针有以下特点: 1. 可以被赋值为NULL,...

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

    ### 浅析C++中的引用与指针 #### 引言 在C++编程语言中,指针和引用是两个非常重要的概念。正确理解和运用它们能够显著提高代码的效率和可读性。本文旨在深入剖析C++中的引用与指针,并通过具体的例子来对比和解释...

    C++指针与指针数组的两个实例 可运行

    在C++编程语言中,指针是至关...理解和熟练掌握指针与指针数组是成为C++程序员的必经之路,它们对于编写高效、灵活的代码至关重要。通过实践这些例子,读者将能更好地理解指针的含义和具体用法,从而提升C++编程技能。

    C++指针 数组 内存释放.docx

    定义指针变量的方法与定义其他变量相同,唯一的区别是指针变量名前面需要加一个星号(*)作为前缀。例如,定义两个指针变量,指向一个整数: int* pNumberOne; int* pNumberTwo; 使用指针访问内存地址 可以使用...

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

    在C++编程语言中,指针和引用是两种非常关键的概念,它们都允许我们间接访问内存中的对象。然而,它们之间存在着本质的区别,理解和掌握这些差异对于编写高效、安全的代码至关重要。 首先,指针是一个变量,它存储...

    C++第4章_数组与指针(C++课件,中南大学)

    指针与数组的关系紧密,指针可以用来操作数组,尤其是在函数参数传递和动态内存管理中。在函数中,通过传入数组的指针,可以避免复制整个数组,提高效率。此外,指针也可以用于多维数组,如二维数组,它们在内存中按...

    C++之数组与指针的异同 pdf

    5. **语法糖**:在很多情况下,C++允许将数组名和指针进行相似的操作,例如解引用和递增操作,但这仅仅是语法上的便利,并不代表它们是相同的。 ### 示例代码解析 在提供的示例代码中,作者通过几个简单的例子展示...

    c++ 二级指针与二维数组之间值操作

    在C++编程语言中,二级指针(Double Pointer)是一个非常重要的概念,它是指向指针的指针。二级指针常用于管理动态内存分配的多维数组,尤其是在处理二维数组时,能提供灵活且高效的访问方式。本示例通过一个简单的6...

    C++指针精髓 笔记

    指针与数组有着密切关系,因为数组名实际上是一个指向数组首元素的常量指针。这使得可以通过指针进行数组操作,例如`int arr[5]; int *p = arr;`,然后可以通过`p`遍历数组。 指针还能用于函数参数,实现参数的传递...

    c++ 成员函数指针

    成员函数指针与functor之间的联系在于,functor有时可以用来模拟成员函数指针的行为,尤其是当需要一个可重用的、可存储的或可比较的“函数”时。成员函数指针只能指向特定类的成员,而functor可以更灵活,因为它是...

    c++ “指针”学习建议

    10. **指针与引用**: - 引用是C++中的另一种间接访问变量的方式,它类似于别名。与指针不同,引用一旦初始化就不能改变引用的对象,且不需要解引用操作。 学习C++指针时,理解这些基本概念并结合实践是非常重要的...

    C#调用C++生成的DLL,并返回结构体引用或者结构体指针多个值

    C++引用在C#中无法直接映射,但可以通过返回指针并使用`ref`关键字来模拟。在C++中,你需要修改`GetStruct`函数以返回结构体的引用: ```cpp extern "C" __declspec(dllexport) void GetStructRef(MyStruct*& ...

Global site tag (gtag.js) - Google Analytics