<强>值传递:强>
最常见的一种传参方式,函数的形参是实参的拷贝,函数中改变形参不会影响到函数外部的形参,一般是函数内部修改参数而又不希望影响到调用者的时候会采用值传递。
<强>指针传递强>
形参是指向实参地址的一个指针,顾名思义,在函数中对形参指向的内容操作,实参本身会被修改。
<强>引用传递强>
在c++中,引用是变量的别名,实际上是同一个东西,在内存中也存在同一个地址。换句话说,不管在哪里对引用操作,都相当直接操作被引用的变量。
下面看演示:
# include & lt; iostream>//值传递 空白func1 (int) { std:: cout & lt; & lt;“值传递,变量地址:“& lt; & lt;和一个& lt; & lt;”,变量值:“& lt; & lt;& lt; & lt;std:: endl; + +; }//指针传递 空白func2 (int * a) { std:: cout & lt; & lt;”指针传递,变量地址:“& lt; & lt;& lt; & lt;”,变量值:“& lt; & lt;* & lt; & lt;std:: endl; *=* + 1; }//引用传递 空白func3 (int&一){ std:: cout & lt; & lt;”指针传递,变量地址:“& lt; & lt;和一个& lt; & lt;”,变量值:“& lt; & lt;& lt; & lt;std:: endl; + +; } int main () { int=5; std:: cout & lt; & lt;“变量实际地址:“& lt; & lt;和一个& lt; & lt;”,变量值:“& lt; & lt;& lt; & lt;std:: endl; func1(一个); std:: cout & lt; & lt;“值传递操作后,变量值:“& lt; & lt;& lt; & lt;std:: endl; std:: cout & lt; & lt;“变量实际地址:“& lt; & lt;和一个& lt; & lt;”,变量值:“& lt; & lt;& lt; & lt;std:: endl; func2 (,); std:: cout & lt; & lt;”指针传递操作后,变量值:“& lt; & lt;& lt; & lt;std:: endl; std:: cout & lt; & lt;“变量实际地址:“& lt; & lt;和一个& lt; & lt;”,变量值:“& lt; & lt;& lt; & lt;std:: endl; func3(一个); std:: cout & lt; & lt;“引用传递操作后,变量值:“& lt; & lt;& lt; & lt;std:: endl; 返回0; }
输出结果如下:
变量实际地址:0 x28feac变量值:5
值传递,变量地址:0 x28fe90变量值:5
值传递操作后,变量值:5
变量实际地址:0 x28feac,变量值:5
指针传递,变量地址:0 x28feac变量值:5
指针传递操作后,变量值:6
变量实际地址:0 x28feac,变量值:6
指针传递,变量地址:0 x28feac变量值:6
引用传递操作后,变量值:7
上面介绍了c++的三种参数传递方式,值传递和指针传递容易理解,那么去是不是也有这些传参方式呢?这引起过争论,但是对比c++的引用传递的概念,我们可以说,没去有引用传递方式。为什么这么说,因为没去有变量的引用这一概念。但是去有引用类型,这个稍后再解释。
先看一个去传值和传指针的例子:
主要包 导入( “fmt” ) 函数main () { 答:=1 fmt。Println(“变量实际地址:“,,,”变量值:",a) func1 (a) fmt。Println(“值传递操作后,变量值:",a) fmt。Println(“变量实际地址:“,,,”变量值:",a) func2 (,) fmt。Println(指针传递操作后,变量值:",a) }//值传递 func func1 (int) { + + fmt。Println(“值传递,变量地址:“,,,”变量值:",a) }//指针传递 func func2 (* int) { *=* + 1 fmt。Println(指针传递,变量地址:“,,”变量值:“,*一个) }
输出结果如下:
变量实际地址:0 xc04203c1d0变量值:1
值传递,变量地址:0 xc04203c210变量值:2
值传递操作后,变量值:1
变量实际地址:0 xc04203c1d0变量值:1
指针传递,变量地址:0 xc04203c1d0变量值:2
指针传递操作后,变量值:2
可以看出,基本类型的值传递和指针传递和c++并没有什么不同,但是它没有变量的引用这一概念,那去的引用类型怎么理解呢?
在中,引用类型包含切片,字典,通道等。以切片为例,传切片是传引用么?
举个例子:
主要包 导入( “fmt” ) 函数main () { m1:=([]字符串,1) m1[0]="测试" fmt。Println(“调用func1前m1值:“,m1) func1 (m1) fmt。Println(“调用func1后m1值:“,m1) } func func1([]字符串){ 一个[0]=" val1 " fmt。Println (“func1中:”) }去语言到底有没有引用传参(对比c++)