`
birthdog
  • 浏览: 9448 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

转载:C 引用与指针的比较

c 
阅读更多
原文链接:http://tianyou8.blog.hexun.com/48362947_d.html

引用是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语言课程PPT.zip

    4.指针数组与指向指针的指针(识记): 5.指针与结构(领会): 6. 难点和易混淆 五.函数 1.常见的系统库函数(识记): 2.用户自定义函数(简单应用): 2.1函数定义 2.2 函数调用 2.3 函数声明 2.4 函数...

    leetcode超时用例数--:C-C++

    leetcode超时用例数 :open_book: Github    |    :light_bulb: 关于 :books: 本仓库是面向 C/C++ 技术方向校招求职者、初学者的基础知识总结,包括语言、程序库、数据...修饰引用,指向常量的引用(reference to

    leetcode超时用例数-C-:C-

    leetcode超时用例数 :open_book: Github    |    简体中文    |    :light_bulb: ...C/C++ 技术方向校招求职者、初学...修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函

    leetcode超时用例数-C-_Interview:C-_面试

    leetcode超时用例数 :open_book: Github    |    简体中文    |    :light_bulb: ...C/C++ 技术方向校招求职者、初学...修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函

    leetcode2sumc-Interview::books:C/C++面试基础知识总结

    修饰指针,分为指向常量的指针和指针常量; 常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改; 修饰成员函数,说明该成员函数内不能修改成员变量。 使用 const 使用 // 类 class A { private: co

    leetcode超时用例数-interview:面试

    leetcode超时用例数 :open_book: Github    |    :light_bulb: 关于 :books: 本仓库是面向 C/C++ 技术方向校招求职者、初学者的基础知识总结,包括语言、程序库、数据...修饰引用,指向常量的引用(reference to

    leetcode超时用例数--:——

    leetcode超时用例数 :open_book: Github    |    简体中文    |    :light_bulb: ...C/C++ 技术方向校招求职者、初学...修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函

    leetcode超时用例数-Summary:概括

    leetcode超时用例数 :open_book: Github    |    简体中文    |    :light_bulb: ...C/C++ 技术方向校招求职者、初学...修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函

    leetcode超时用例数-Basic:基本的

    leetcode超时用例数    |    :books: Docsify :light_bulb: 关于 :books: ...修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改; 修饰成员

    leetcode超时用例数-Computer:电脑

    修饰指针,分为指向常量的指针和指针常量; 常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改; 修饰成员函数,说明该成员函数内不能修改成员变量。 使用 const 使用 // 类 class A { private: ...

    leetcode2sumc-NaughtyBear_notes:NaughtyBear笔记+搬运+总结

    leetcode 2 sum c NaughtyBearNotes ...修饰指针,分为指向常量的指针和指针常量; 常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改; 修饰成员函数,说明该成员函数内不能修改成员变量。

    windows用户称拦截api

    Windows用户层下拦截api的原理与实现(附源码) (2008-03-29 16:15:07)转载▼ 标签: computer 杂谈 声明:本页所发布的技术文章及其附件,供自由技术传播,拒绝商业使用。本页文章及其附件的所有权归属本文作者...

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    将libosip源码包的SRC目录下的Test目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态库文件)就可以运行(带参数运行,...

    C++轻量级通用插件框架源码

    采用智能指针类来管理接口的引用计数及生命期,可从一个接口动态转换为另一个接口(内部采用C++的RTTI机制动态转换),可以区分插件内部的接口引用和插件外部的接口引用。 d) 模块透明部署 一个模块只需要使用其他...

Global site tag (gtag.js) - Google Analytics