欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

传递机制

程序员文章站 2022-07-14 21:49:35
...

传递机制

开发工具与关键技术:Visual Studio、C++
作者:张国军
撰写时间:2019年05月02日

形参指针对应的实际参数是地址表达式,即对象的指针。
实际参数把对象的地址值赋给形式参数名标识的指针变量。
被调用函数通过形参指针间接访问实参所指对象。
刚开始学的时候我对于传递机制还不是很了解,但是进过一段时间的学习我也有了自己对传递机制有一定的了解,可能我自己的理解方式跟别人的有点不同,但是我自己也并没有觉得有什么不妥,个人有个人的理解方式吧。那么下边大家看看我对传递机制的理解。
值传递、指针传递、引用传递是我们的传递机制,我们通过值的传递可以通过函数进行处理,当然我们的传递机制还有其他,到目前为止,我学的传递机制有:值传递、指针传递、引用传递。至于他们有什么区别,那么我们看下面的例子。

#include <iostream>
void swap(int a, int b) {
	int temp; //临时变量 
	temp = a;
	a = b;
	b = temp;
}
int main() {
	int a = 66, b = 99;
	swap(a, b);
	cout << "a=" << a <<"\t"<< "b=" << b<<endl;
	return 0;
}

传递机制
这是一个值传递的,这个简单的例子是想通过一个参数进行两个值的交换,通过这个我们可以的到,然而我们想交换的值并没有成功。
刚开始学的时候我是这样认为的:当我们进行传递的时候,将值传过去,然后进行改变,我就以为可以改变的,但是进行了很多理解都不行,后俩通过老师的讲解之后,我终于知道了,我们参数接收的实参的一个复制版,也就相当于并不是我们本身的变量了。而是一个临时的局部变量,当我们通过参数进行改变的时候改变的也就是我们的临时变量,也就是我们函数里内的局部变量,然而但我们进行输出我们的变量的时候,我们的值并没有改变所以我们并不可以通过在值传递进行我们需要改变实参的值。
当我们需要改变形参是时候需要用什么呢,那么我目前学的也就两种传递机制,那就是指针传递、引用传递。
这两种跟我们的值传递有什么不同呢,那么我们通过例子来简单的说明吧。
那么我们先来看一下指针传递吧。
指针传递,通过字面意思我们能知道我们需要传递的是指针,当然其他的 也是一样,值传递传递的是值。那么引用传递呢,也是传递引用了。
指针传递我们都知道它进行传递的是地址,并不是值那么我们需要用到的是取址符(&)
那么我们来看一个简单的例子:

#include <iostream>
void swap(int *p1, int *p2) {
	int temp; //临时变量 
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int main() {
	int a = 66, b = 99;
	swap(&a,&b);
	cout << "a=" << a <<"\t"<< "b=" << b<<endl;
	return 0;
}

传递机制
那么我们来简单分析一下:
将变量 a、b 的地址分别赋值给 p1、p2,这样 *p1、*p2 代表的就是变量 a、b 本身,交换 *p1、p2 的值也就是交换 a、b 的值。函数运行结束后虽然会将 p1、p2 销毁,但它对外部 a、b 造成的影响是“持久化”的,不会随着函数的结束而“恢复原样”。也就是我们通过函数进行改变了变量的本身,当我们再次使用变量的时候,它的值已经不是开始的值,然后可以得到我们想要的值。
值得注意的是,我们使用的是指针,指针我们都知道,它是保存地址的,当我们 要使用我们指针指向的值得时候,那么我们就要多进行一步操作,那就是解址,通过解址符(
)进行解址。
当然我们开始的时候给的也要取址符,所以他们是必要的。
这就是我们的指针传递跟我们值传递的区别。
那么我们下边看一下最后的引用传递。
引用传递,引用引用,那就还是传参的本身,引用我们又叫它为别名,就就比如一个人有许多名字,就比喻:一个人名字叫黄小明,那么别人可以叫它黄小明,也可以叫小明,可能他个人比较胖所以别人有可以叫他胖明等其他的叫法。其实无论怎么叫我们叫的都是一个人,本质上是不变都是那一个目标。
所以我们的引用也是如此,我们的实参和形参的名字可以不同,当时我们使用的都是同一个变量的本事,使用当我们改变它的值的时候,那么我们返回去的参数也会随着改变。
所以引用一样可以改变我们想改变的值,那么我们下边看一下我们简单的例子的用法和值得我们需要注意的地方。

#include <iostream>
void swap(int &p1, int &p2) {
	int temp; //临时变量 
	temp = p1;
	p1 = p2;
	p2 = temp;
}
int main() {
	int a = 66, b = 99;
	swap(a,b);
	cout << "a=" << a <<"\t"<< "b=" << b<<endl;
	return 0;
}

传递机制
首先呢我们需要注意的地方那就是我们函数那参数哪里,哪里我们需要用到引用符,至于其他就没什么特别的了,其他跟我们的值传递差不多一样的了,所以我们的结果也是有改变的。
那么我们来说一下我们三个传参的不同。
首先是我们值传递:值传递我们上边说了他是无法改变我们实参的值的,它进行的操作是,当我们传实参过去的时候它会声明一个局部变量跟我们实参值一样的局部变量,当我们进行改变值的时候,那么我们改变的是我们这个局部变量,并没有改变我们的 实参,所以这是我们值传递无法对实参进行改变的。
指针传递:指针传递通过我们上边的例子我们可以看到我们结果的值是有改变的,那么我们就可以通过指针传递去改变得到我们想要的值,那么我们来看一下它所改变的思路。
首先我们需要知道指针的特性,需要知道指针是一个什么样的东西。我们都知道指针是一个保存地址的变量,它可以通过解地址找到我们相应的变量,然后我们对变量进行操作就可以了。但是值得我们注意的地方是我们传参的时候,还有就是我们使用指针的时候。传参我们传的是地址,使用指针参数我们需要通过解址。所以这就是我们需要注意的地方。
最后我们的引用传递,引用传递跟我们的值传递差不多,只是一个可以改变变量的值一个不可以,那么我们都知道值传递是不可以的,那么我们的引用传递是可以的。那么我们上边有说过引用就相当于一个别名,那么我们操作的 时候就相当于操作实参的本身,所以能够进行值得改变。
这呢是我对传递机制理解,如果大家有什么不同的理解方式呢,那么欢迎大家分享言论。

相关标签: 传递机制