内容简介:现代编程语言对于值传递与引用传递的支持程度是比较不同的首先介绍值传递与引用传递的概念将变量
现代编程语言对于值传递与引用传递的支持程度是比较不同的
首先介绍值传递与引用传递的概念
值传递
将变量 a 传递到其他的函数并对其更改,不能影响a的值
引用传递
在其他的作用域对传入的变量 a 的更改可以影响a的值
Note:
在这里的值的概念,对于原始类型,指的就是字面的值,如1,2,'a';
而对于动态内存分配/类,则指的是指向这个分配内存/类的引用,而非解引用后指向的内存/类所保存的值
C语言
C语言本身只支持值传递,但是通过指针这一概念,通过解引用可以达到引用传递的效果
C++
作为 C语言 的超集发展起来的语言,C++支持C语言的值传递与指针传递,同时C++还添加了引用传递(某种意义上是指针的语法糖),所以C++实际上通过两种语法支持引用传递
下面演示C/C++的值传递与引用传递
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/// 基础类型热引用
void swap_ref(int &a, int &b) {
int t = a;
a = b;
b = t;
}
/// 类的引用
void swap_ref(string &a, string &b) {
string t = a;
a = b;
b = t;
}
/// 值传递
void swap_val(int a, int b) {
int t = a;
a = b;
b = t;
}
/// 类的值传递
void swap_val(string a, string b) {
string t = a;
a = b;
b = t;
}
/// 基于指针进行引用传递
void swap_ptr(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
void swap_ptr(string *a, string *b) {
string t = *a;
*a = *b;
*b = t;
}
int main() {
int a = 1;
int b = 2;
swap_ref(a, b);//引用传递
printf("%d %d\n", a, b);
swap_val(a, b);//值传递
printf("%d %d\n", a, b);
string x = "x", y = "y";
swap_ref(x, y);//引用传递
cout << x << " " << y << endl;
swap_val(x, y);//值传递 无效果
cout << x << " " << y << endl;
/// \brief 使用指针本身进行值传递 通过解引用达到了解引用的效果
swap_ptr(&a, &b);//通过指针引用传递
printf("%d %d\n", a, b);
swap_ptr(&x, &y);//指针的引用传递
cout << x << " " << y << endl;
return 0;
}
$ ./main.exe 2 1 2 1 y x y x 1 2 x y
Notes:
- 使用指针可以改变其指向的对象的值,但是其无法改变其指针自己的值,如果想改变指针指向的对象,如果想在其他函数改变 指针 的值,只能取这个指针的指针,这又回到了 swap 这个问题
Java
Java可能是处于控制语言的复杂度的考虑,只支持值传递。
同样的还有 Python 。
public class type {
public static void main(String[] args) {
String s = "One String";
System.out.println(s);
changeString(s);
System.out.println(s);
}
public static void changeString(String s) {
s = "Yet Another String";
}
}
C
C#在很多特性是和 Java 很类似,但是在类型系统中,C#同时支持值类型与引用类型。
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int a = 1, b = 2;
swap(ref a, ref b);
Console.WriteLine($"a = {a} b = {b}");
swap(a, b);
Console.WriteLine($"a = {a} b = {b}");
string x = "x-ray", y = "y-ray";
swap(ref x, ref y);
Console.WriteLine($"x = {x} y = {y}");
swap(x, y);
Console.WriteLine($"x = {x} y = {y}");
}
private static void swap(int a, int b)
{
int t = a;
a = b;
b = t;
}
private static void swap(ref int a, ref int b)
{
int t = a;
a = b;
b = t;
}
private static void swap(string a, string b)
{
string t = a;
a = b;
b = t;
}
private static void swap(ref string a, ref string b)
{
string t = a;
a = b;
b = t;
}
}
}
$ a = 2 b = 1 a = 2 b = 1 x = y-ray y = x-ray x = y-ray y = x-ray
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【编程语言】Python 的参数传递、返回值、浅拷贝、深拷贝
- C++ 值传递、指针传递、引用传递详解
- 简明笔记:指针传递和值传递
- golang中的函数参数值传递和引用传递
- 这一次,彻底解决Java的值传递和引用传递
- Python函数中参数是值传递,还是引用传递?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
运营其实很简单:互联网运营进阶之道
郑文博 / 人民邮电出版社 / 2018-2 / 49.80元
为了帮助从事运营或即将从事运营的广大读者更好、更快地了解运营、学习运营、入职运营,本书详细阐述运营对于用户、企业的帮助,同时以单个理论点 单个实战案例的方式详细分析了社群运营、活动运营、新媒体运营、内容运营、渠道运营、精细化运营、场景化运营、用户化运营、商业化运营等模块及运营工作、渠道整合、社群知识、渠道优化、SOP流程等细节,力求让读者在求职路上快速上手,在迷茫途中快速定位。 《运营其实很简单 ......一起来看看 《运营其实很简单:互联网运营进阶之道》 这本书的介绍吧!