网站怎么做营销,wordpress文章输入密码可见,新手如何学网站建设,长网址变成短网址面试题#xff1a;简述什么是值传递和引用传递#xff1f;
什么是值传递#xff1f;
值传递#xff08;pass by value#xff09;是指在调用函数时#xff0c;把实际参数的值复制一份传递给函数。换句话说#xff0c;函数内部对参数的任何修改#xff0c;都不会影响到…面试题简述什么是值传递和引用传递
什么是值传递
值传递pass by value是指在调用函数时把实际参数的值复制一份传递给函数。换句话说函数内部对参数的任何修改都不会影响到原始的实际参数。这是因为传递的是“副本”跟原值没直接联系。
举个例子
func GetA(b int) int {b // 改的是 b 的副本return b
}func main() {a : 1resultA : GetA(a) // a 的值被复制到 bfmt.Println(resultA) // 输出 2fmt.Println(a) // a 还是 1
}在这个例子中a的值被复制了一份传给函数GetA所以函数内部的修改不会影响到外面的a。 什么是引用传递
引用传递pass by reference是指直接将实际参数的“地址”传递给函数。函数内的参数变动会直接影响到实际参数的值因为函数操作的是原始的“引用”而不是副本。
然而许多编程语言比如 Java 和 Go其实并不是严格意义上的引用传递。它们传递的依然是“值”只不过这个“值”可能是对象的引用也就是内存地址的副本。这点是很多人容易误解的地方。 常见误解别踩坑 “值传递是传值引用传递是传引用。” 误问题的关键不在传的是什么而在于“传递的值有没有被复制”。 “Java 是引用传递。” 错Java 传的是引用的副本是“值传递”。复制了引用实际参数地址不会被直接修改。 “传递基本类型是值传递传递对象是引用传递。” 依然错语言本质还是值传递传对象时是引用的值被复制而不是直接传递引用。 再补充点知识特殊的“传共享对象调用”
传共享对象有点像引用传递的“拐弯版”。实际参数的地址被复制一份传给函数操作的是复制后的地址最后依然指向原始的值。你要改这个值完全没问题但如果试图改引用本身的指向就没用。 求值策略的简单解释
求值策略决定了参数在函数调用时是怎么被处理的。这里补充一下最常见的几种 传值调用值传递 直接复制参数的值函数内部改动对实际参数无影响。 传引用调用引用传递 传的是参数的引用函数内改动会直接反映到原始参数上。 传共享对象调用共享对象传递 传递对象的引用副本操作引用指向的值有效改引用本身无效。 编程语言中的值传递 VS 引用传递
Go 语言的例子
package mainimport fmtfunc GetB(b int) {b // 改的是 b 的副本
}func main() {b : 1GetB(b)fmt.Println(b) // b 还是 1因为改的是副本
}还有字符串的例子
func subString(str string, start int, end int) (*string, string) {var s strsubStr : str[start:end]return s, subStr
}func main() {str : 123我们_, result : subString(str, 0, 3)fmt.Println(result) // 输出 123
}Go 永远是值传递哪怕传递的是引用还是复制了引用的副本。 Java 的例子
public class Main {public static void main(String[] args) {int a 1;int b getA(a);System.out.println(b); // 输出 2System.out.println(a); // a 还是 1}public static int getA(int b) {b; // 改的是 b 的副本return b;}
}字符串的例子
public class Main {public static void main(String[] args) {String s 123我们;String result subString(s);System.out.println(result); // 输出 123}public static String subString(String str) {return str.substring(0, 3); // 截取字符串返回一个新字符串}
}Java 的参数传递本质也是值传递传递对象时传的是“引用的副本”。 小总结
值传递传递的是参数的值函数内修改对实际参数无影响。引用传递传递的是参数的引用函数内修改直接影响实际参数。**Java 和 Go 的参数传递**都是值传递。传递的可能是值的副本也可能是引用的副本但一定是“复制”过的东西。
记住这个逻辑搞清“传的内容有没有被复制”以后面试再也不慌啦
最后说一句(求关注求赞别白嫖我) 最近无意间获得一份阿里大佬写的刷题笔记一下子打通了我的任督二脉进大厂原来没那么难。 这是大佬写的 7701页的BAT大佬写的刷题笔记让我offer拿到手软 本文已收录于我的技术网站 cxykk.com程序员编程资料站有大厂完整面经工作技术架构师成长之路等经验分享
求一键三连点赞、分享、收藏
点赞对我真的非常重要在线求赞加个关注我会非常感激