博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数返回值、引用和指针的区别思考
阅读量:4051 次
发布时间:2019-05-25

本文共 1182 字,大约阅读时间需要 3 分钟。

原创  函数返回值、引用和指针的区别思考 

学了引用、指针后,这些概念被教材拿去和函数搅在一起,于是使人感到很糊涂。涉及到函数返回的到底是值,引用还是指针的问题,其实就是函数返回的过程中和函数结束的过程中,哪些保留了,哪些复制了,哪些被处理掉的问题。我是这样理解的:

首先说函数内的对象的保留和处理——当函数结束的时候,所有除了堆中的对象(不考虑传入了什么样的参数的前提下)之外的函数成员,全部都会被处理掉,无法保留;

其次,在返回的过程中,其实无论是引用,指针还是值,只要是跟在return后面的,都会以复制的方式来返回。但在这里,复制引用和指针并不代表复制它们所引用,所指向的对象(或内存对象),因此,复制它们只是复制了一个入口,这也就是这种复制方式更节省资源的原因。

最后,所有因为在函数的return后面而被作为返回复制出来的东西(包括值,引用和指针),都会在函数被调用的那一行执行结束后,被清理掉(唯有一种情况例外,就是被复制出来的是值,而值被“赋予”了一个引用)。因此,在被清理掉之前,要想完成传递,必须把它们赋予另一个变量或引用或指针。但是赋予变量或引用或指针,却将会导致不同的结果。赋予变量的任何返回内容,都会被变量所保存,因为变量就是一块实实在在的内存,能够存东西。而赋予引用的返回对象,如果是引用的话,其实等于只保存了一个入口,但却没有保存下入口后面所有实实在在的内容。另一方面,将指针赋予指针会有两种情况,如果指针指向栈中的对象,那么结果和引用赋予引用差不多,但如果指针指向堆中的对象,则可以看作是指针得到了继承,一个指针通过它所继承的另一个指针所记录的地址,成功地找到了一块实实在在的内存……

从表现和操作流程上来说,

第一种情况:函数如果返回的是值,那么在函数调用时,返回的值会被从函数中复制出来使用。当函数结束时,函数中的对应对象会被析构或结束,但复制出来使用的这一份仍然存在。

第二种情况:函数如果返回的是引用,那么在函数调用时,引用的对象不会被复制,只是引用本身被复制了。使用这个引用的问题是,当函数结束时,引用的对象也同时被析构,因此引用会变成空引用。由于不会被复制,因此除非被赋予一个新的对象,否则如果被赋予的对象是引用或是指针,则会导致引用和指针直接连向将要被析构的函数内的对象,于是,当函数内的对象被析构时,引用就会为空,而指针则虽然找到了地址,但却因为对象的值被处理而出现失效的问题。

第三种情况:函数如果返回的是指针,那么在函数调用时,指针指向的对象不会被复制,只是指针本身被复制了一次,使用这个指针同样会有指向的对象被析构的危险,但如果将这个指针赋予了另一个指针,且指针指向的对象在堆中的话,则可以继续使用指针指向的堆中对象,因为这里对象的地址得到了继承。但如果是栈中的对象,则会出问题,因为栈中的对象会在函数结束时被自动析构。

转载地址:http://qssci.baihongyu.com/

你可能感兴趣的文章
jxbrowser 实现自定义右键菜单 jxbrowser破解版请联系作者
查看>>
快速开发框架设计
查看>>
需要统计的数据
查看>>
eclipse js jsp 卡怎么办,解决办法
查看>>
高性能J2EE接口平台设计
查看>>
spring mvc tomcat 线程池的坑
查看>>
JAVA 生成不重复订单号 优化版本 订单号格式为yyyymmdd后面自增
查看>>
mybatis-jpa插件使用教程
查看>>
cas 4.2.7 和 Nginx 整合遇到的问题 登录一会可以一会不可以
查看>>
CAS 单点登出 loginout 解决方案 -- 最靠谱的方案,不是抄的--还是不靠谱大家不要抄了
查看>>
springboot 支持jsp 直接访问jsp办法无需通过controller转发
查看>>
后续框架可以优化的点
查看>>
SpringBoot Logback 配置参数迁移到配置中心 Apollo
查看>>
springboot 自定义webroot的目录
查看>>
springboot springmvc j2ee 做伪静态化 .html 转发到 .jsp
查看>>
我入行以来java框架的几个阶段&论什么是真正的组件开发&项目中部分源码干货分享
查看>>
java-真正面向配置+组件的开发
查看>>
Mybattis Jpa插件简介
查看>>
java编程奇淫技巧之让java帮我们生成java代码后不停服,直接编译为class并且反射为对象直接使用
查看>>
springMVC源码阅读之FORM参数绑定
查看>>