VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1442|回复: 13

关于指针与引用

[复制链接]

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-19 09:20:02 | 显示全部楼层 |阅读模式
请问各位高手
在给函数传递参数时,什么时候传指针还是引用,它们各有什么优点
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-1-26 00:18:01 | 显示全部楼层
指针灵活一些,可以适应很多情况
引用看起来更方便一些,但引用也不是绝对安全,如:

int* pt = 0;
int& ref = *pt;//这个引用跟空指针是一样的
回复

使用道具 举报

0

主题

12

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-1-26 01:27:02 | 显示全部楼层
很多书都有讲过这个问题了。
引用也是一个指针,只不过是确确实实指明了地址的指针,因此传引用时不须考虑是否为空,而指针则须考虑,根据实际情况采用传递方式。
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-1-26 03:27:01 | 显示全部楼层
无所谓优点,
习惯问题而已 ~~

C 中没有引用,只有指针;
C++ 估计引用使用的比较多一些 ~~
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-1-26 03:45:01 | 显示全部楼层
什么时候用指针什么时候用引用并没有什么标准可以遵循
看需要吧,如果你希望传入以后能够指向别的对象,或者你希望在数组中遍历的话,那么就只能用指针了

我自己的方针是“尽量用引用”,但不排斥指针
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-1-26 07:45:02 | 显示全部楼层
能传引用的地方,尽量传引用
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-1-26 07:54:01 | 显示全部楼层
goodjianli:你看看我的例子,你就不会说不会有空引用了

还有一种情况,如果我声明了一个引用,但不指向谁,那也跟空指针和野指针一样严重
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-1-26 20:36:01 | 显示全部楼层
楼上的,引用是必须赋初值的
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-1-26 22:45:01 | 显示全部楼层
首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
char *pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值
这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)。应该躲开写出这样代码的人,除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。
以上内容引自More Effective C++条款1
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-1-31 23:09:02 | 显示全部楼层
在c++标准里面确实禁止在引用定义时不加初始化,问题是,如果有些人不知道这个,而且
在旧的编译器里面试验的时候,不初始化的引用不会引起编译错误,可能只是一个警告,甚至
在一些特殊的编译器里面,会把未初始化引用定义成类似于空指针的东西,在一些既有的企业级
代码中甚至利用这样一种特性,在一些应用的上下文中,这个特性是有价值的。——这样的系统,
当然你可以去全部改成指针,问题是,需要时间,许多许多的时间,这样一来,企业宁可使用
原来那个老古董编译器,对原有代码作一些简单修改,而不是全盘重写,因为重写这些代码的
代价太大。

标准与实现是有差距的,只能是尽量提倡有益的东西,但有时候别一棍子打死,有许多原有代码
需要维护的,绝对符合标准的C++编译器,据我所知,目前应该没有,即便学院式的编译器,
也只能做到99%或者99.9%

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表