- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
指针和引用
基本的一个原则:如果一个值可能为 NULL 的话就用指针,要不然就用引用,能用引用的尽量用引用
指针和引用的联系与区别
指针和引用的联系与区别
★ 相同点:
1. 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
★ 区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
4. 引用不能为空,指针可以为空;
5. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所
指向的变量或对象的地址)的大小;
6. 指针和引用的自增(++)运算意义不一样;
7.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
引用使用起来比较的方便,指针相对比较灵活一点,
1)引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值.
(2)不存在NULL引用,引用必须与合法的存储单元关联;而指针则可以是 NULL.
(3)引用一旦被初始化为指向一个对象,它就不能被改变不另一个对象的引用;而指针在 任何时候都可以改变为指向另一个对象.给引用赋值并不是改变它和原始对象的绑定关系.
(4)引用的创建和销毁并不会调用类的拷贝构造函数
(5)在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.
总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性. 1值传递
void Func(int x)
{
x=x+10;//修改的是 n 在堆栈中的拷贝x
}
int n=0;
Func(n);
coutn=nendl;//n=0
2指针传递
void Func2(int *x)
{
(*x)=(*x)+10;//修改指针x 指向的内存单元的值
}
int n=0;
Func(n);
coutn=nendl;//n=10
3.引用传递
void Func3(int x)
{
x=x+10;//修改的是 x 引用到的对象n
}
int n=0;
Func3(n);
coutn=nendl;//n=10
指针与引用看上去完全不同(指针用操作符’ *’和’-’,引用使用操作符’ .’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
char *pc = 0; // 设置指针为空值
char rc = *pc; // 让引用指向空值
这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。
因为引用肯定会指向一个对象,在 C 里,引用应被初始化。
string rs; // 错误,引用必须被初始化
string s(xyzzy);
string rs = s; // 正确,rs 指向 s
指针没有这样的限制。
string *ps; // 未初始化的指针
// 合法但危险
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
void printDouble(const double rd)
{
cout rd; // 不需要测试rd,它
} // 肯定指向一个 double 值
相反,指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
if (pd) { // 检查是否为NULL cout *pd;
}
}
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
string s1(Nancy); string s2(Clancy);
string rs = s1; // rs 引用 s1
string *ps = s1; // ps 指向 s1 rs = s2; // rs 仍旧
文档评论(0)