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
对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?
答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?
如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利
分享到:
相关推荐
在这个“ios-swift导航栏控制器传值,简单明了,新手可以参考”的项目中,我们主要讨论的是如何在Swift中利用UINavigationController进行数据传递,特别是对于初学者来说,这是一个非常实用且基础的话题。...
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种图形化编程环境,主要用于开发数据...在编程过程中,务必注意代码的清晰性和可读性,避免过度依赖某一传值方式,以保持程序的灵活性和可扩展性。
- 考虑到性能和代码可维护性,应尽量避免过度复杂的设计,保持代码简洁明了。 - 在实际应用中,结合使用多种方法可以提高灵活性和适应性,确保用户体验。 总之,理解和掌握以上这些模态窗口传值的策略和技术,将...
以上介绍了几种常用的JSP页面传值方式,包括使用表单、URL重写、JavaScript动态改变表单行为、JSP内置对象和标签库以及Cookie和Session。不同的场景下可以选择不同的方法来满足需求。在实际应用中,开发者还需要考虑...
本文将详细介绍一种实用而优雅的窗体传值方法,并通过具体的代码示例来展示如何实现模态和非模态的窗体数据传递。 #### 方法介绍 本文中所提及的窗体传值方法主要包括两种方式: 1. **模态窗体传值**:该方式下,当...
标题中的“vb.net读取易语言dll并传值”指的是使用VB.NET编程语言与易语言编写的动态链接库(DLL)进行交互,实现数据的传递和读取。易语言是一种简洁明了的中国本土编程语言,而VB.NET是微软.NET框架下的面向对象...
本资源“简单明了的地图样式表”提供了一种易于理解和使用的样式配置,适用于快速定制地图的外观。以下是关于地图样式表及其相关知识点的详细说明: 1. **地图样式表(Map Style Sheet)**:地图样式表通常以JSON...
matlab下的JPEG压缩程序,包括DCT变换,量化,反量化和反DCT变换。实用简单
理解子过程的定义、调用以及参数传递机制(传值和传址),对于VB程序设计至关重要。在实际编程中,要灵活运用这些知识,以便更高效地编写和管理代码。例如,可以创建一个子过程来处理复杂的计算任务,或者封装一些...
你需要了解如何定义和调用函数,以及参数传递的方式(传值与传址)。函数可以封装一组操作,提高代码的复用性和可读性。 指针是C语言的一大特色,也是其强大的原因之一。指针可以存储内存地址,通过指针可以间接...
读者会学习如何定义函数、调用函数,以及函数参数的传递方式——传值和传址。此外,函数指针也是C语言的一个亮点,它使得函数可以作为参数传递,也可以作为返回值。 数组和指针是C语言的精髓,它们在编程中起着至关...
资料中会详细介绍如何定义和调用函数,以及函数参数的传递机制,包括传值和传址。 4. **数组与指针**:这是C语言的两大特色。数组允许存储一组相同类型的数据,而指针则可以指向内存地址,是操作内存的重要工具。...
在日常运营中,有时我们需要调整文章的发布时间,例如将一篇旧文设定为新发布,或者因为时间调整而更新所有相关文章的时间戳。这个插件就解决了这一需求,让批量修改变得轻而易举。 除了修改发布时间,此插件还支持...
4. **函数**:学习如何定义和调用函数,理解参数传递的方式,包括传值和传址,以及如何使用递归函数。 5. **结构体与联合**:结构体允许我们将不同类型的变量组合成一个整体,而联合则在有限的内存空间内存储多种...
【标题解析】:“收藏的30篇文章贯通考研词汇”这个标题表明这是一份资源集合,包含30篇文章,专门设计来帮助考生通过阅读理解和学习这些文章来掌握考研所需的英语词汇。这里的“贯通”可能意味着这些文章旨在帮助...
A4输入法A4输入法简单明了A4输入法简单明了A4输入法简单明了A4输入法简单明了
4. 函数:了解函数的定义、调用,参数传递(传值与传址),以及如何使用递归函数。 5. 数组:讲解一维数组、二维数组的声明、初始化,以及数组作为函数参数的处理方式。 6. 指针:深入探讨指针的概念,如何声明、...
1. **语法结构**:C语言的语句结构简单明了,包括变量声明、赋值操作、条件语句(if...else)、循环语句(for, while, do...while)以及函数定义等。初学者需要掌握这些基本语法,以便编写出结构清晰的程序。 2. **...