引用传递与指针传递区别

上传人:鲁** 文档编号:491567043 上传时间:2023-01-12 格式:DOCX 页数:5 大小:18.41KB
返回 下载 相关 举报
引用传递与指针传递区别_第1页
第1页 / 共5页
引用传递与指针传递区别_第2页
第2页 / 共5页
引用传递与指针传递区别_第3页
第3页 / 共5页
引用传递与指针传递区别_第4页
第4页 / 共5页
引用传递与指针传递区别_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《引用传递与指针传递区别》由会员分享,可在线阅读,更多相关《引用传递与指针传递区别(5页珍藏版)》请在金锄头文库上搜索。

1、C+中引用传递与指针传递区别在C+中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数 是有本质上的不同的:指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调 函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数 放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任 何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针 本身的地址值不会变)而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空 间,但是这时存放的是由主调函数放进来的实参变量的地址。

2、被调函数对形参的任何操作都 被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调 函数对形参做的任何操作都影响了主调函数中的实参变量。引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但 是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而 对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。 如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者 指针引用。为了进一步加深大家对指针和引用的区别,下面我从编译的角度来阐述它们之间的区 别:程序在编译时分别将指针

3、和引用添加到符号表上,符号表上记录的是变量名及变量所对 应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的 地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变其指向的对象(指 针变量中的值可以改),而引用对象则不能修改。最后,总结一下指针和引用的相同点和不同点:相同点:都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。不同点:指针是一个实体,而引用仅是个别名;引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可 以“见异思迁”;引用没有const,指针有const, const的指针不可变

4、;(具体指没有int& const a这种形 式,而 const int& a 是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需 要这种形式,后者指引用所指的值不可以改变)引用不能为空,指针可以为空;“sizeof引用”得到的是所指向的变量(对象)的大小,而“sizeof指针”得到的是指针本身 的大小;typeid (T) = typeid (T&)恒为真,sizeof (T) =sizeof (T&) 恒为真,但是当 引用作为成员时,其占用空间与指针相同(没找到标准的规定)指针和引用的自增(+)运算意义不一样;引用是类型安全的,而指针不是,引用比指针多了类型检查 联系1. 引

5、用在语言内部用指针实现(如何实现?)。2. 对一般应用而言,把引用理解为指针,不会犯严重语义错误。引用是操作受限了的指针(仅容许取内容操作)。引用是C+中的概念,初学者容易把引用和指针混淆一起。一下程序中,n是m的一 个引用(reference), m 是被引用物(referent)。int m;int &n = m;n 相当于 m 的别名(绰号),对 n 的任何操作就是对 m 的操作。例如有人名叫王小毛, 他的绰号是“三毛”说“三毛”怎么怎么的,其实就是对王小毛说三道四。所以n既不是 m 的拷贝,也不是指向 m 的指针,其实 n 就是 m 它自己。引用的一些规则如下:(1)引用被创建的同时必

6、须被初始化(指针则可以在任何时候被初始化)。(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+语言中,函数的参数和返回值的传递方式有三种:值传递

7、、指针传 递和引用传递。以下是“值传递”的示例程序。由于Funci函数体内的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

8、以下是“引用传递”的示例程序。由于Func3函数体内的x是外部变量n的引用,x 和n是同一个东西,改变x等于改变n,所以n的值成为10.void Func3(int&x)x = x + 10;int n = 0;Func3(n);cout “n = ” n ,引用使用操作符。),但是它们 似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指 针,在什么时候使用引用呢?首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对 象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任 何对象,这时你应该把变量声明为指针,因为这

9、样你可以赋空值给该变量。相反,如果变量 肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。“但 是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”char *pc = 0; / 设置指针为空值char &rc = *pc; / 让引用指向空值这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事 情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的 代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去 做。我们以后将忽略一个引用指向空值的可能性。因为引用肯定会指向一个对象,在C里

10、,引用应被初始化。String &rs; / 错误,引用必须被初始化string s( xyzzy);string &rs = s; / 正确, rs 指向 s指针没有这样的限制。string *ps; / 未初始化的指针/ 合法但危险不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在 使用引用之前不需要测试它的合法性。void printDouble (const double &rd)coutvvrd; /不需要测试rd,它 /肯定指向一个double值相反,指针则应该总是被测试,防止其为空:void printDouble (const double *pd)i

11、f (pd)/ 检查是否为 NULLcout v(10); /建立整形向量(vector),大小为10;/向量是一个在标准C库中的 一个模板(见条款 35) v5 = 10; /这个被赋值的目标对象就是操作符返回的值如果操作符返回一个指针,那么 后一个语句就得这样写:*v5 = 10;但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这 有一个有趣的例外,参见条款 30)当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必 要的语义误解时,你不应该使用指针(而在除此之外的其他情况下,则应使用指针假设你有 void func (int* p, i

12、nt &r);int a = 1;int b = 1;func (&a,b);指针本身的值(地址值)是以pass by value进行的,你能改变地址值,但这并不会改变 指针所指向的变量的值,p = someotherpointer; /a is still 1但能用指针来改变指针所指向的变量的值,*p = 123131 ; / a now is 123131但引用本身是以pass by reference进行的,改变其值即改变引用所对应的变量的值r = 1231; / b now is 1231尽可能使用引用,不得已时使用指针(当你不需要“重新指向”时,引用一般优先于指针被选用(这通常意味着引用用于类的 公有接口时更有用(引用出现的典型场合是对象的表面,而指针用于对象内部(上述的例外情况是函数的参数或返回值需要一个“临界”的引用时。这时通常最好返回 /获取一个指针,并使用 NULL 指针来完成这个特殊的使命。(引用应该总是对象的别名, 而不是被解除引用的 NULL 指针)。注意:由于在调用者的代码处,无法提供清晰的的引用语义,所以传统的 C 程序员有 时并不喜欢引用。然而,当有了一些 C+ 经验后,你会很快认识到这是信息隐藏的一种形 式,它是有益的而不是有害的。就如同,程序员应

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号