栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言基础:swap函数一定要传指针吗?操作变量的本质是操作内存空间。

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言基础:swap函数一定要传指针吗?操作变量的本质是操作内存空间。

大家在学习C语言的时候,一定遇到过经典的swap函数,它的作用是交换两个变量的值。老师讲的时候一定会说:要传变量的指针,不然不会交换两个变量的值。
传值:
void swap(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
传地址:
void swap(int* a,int* b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}

可是大家有没有想过为什么传指针才能交换两个变量的值。
这涉及到函数调用的知识,C语言是用栈传递函数参数的(默认状态下),如果直接传值的话,会在栈中另外开辟两个空间,把变量的值赋值到新开的空间中。函数里,交换的是栈中两个空间的值,所以不会影响原始值。
传地址的话,相当于把原始值的两块儿空间传给了函数,函数里交换的是原始两块儿空间的值,自然实现了两个变量的交换。

大家发现了吗?只要让swap索引到原始值的内存地址,就可以实现变量的交换。也就是说操作变量就是操作内存地址。 给变量赋值就是把值写到变量对应的内存地址,读变量就是读取变量对应的内存地址。

那么我们开一下脑洞,有没有不通过传指针,通过别的方式,让swap函数知道变量内存地址的方法呢?
有的,C语言里可以用全局变量,全局变量的作用域是整个工程。
int a = 1;
int b = 2;

void swap()
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
这样也可以交换变量 a、b的值。

我们再开一下脑洞,是由于C语言函数的传值模式导致的,无法交换两个数据。因为在栈里重新开辟了空间。 如果我们自己开发一门语言,函数调用不用值传递,而是直接把地址传递给函数,是不是就可以交换成功了呢。 (VB用的就不是值传递)

所以看到了吗,理解了变量,理解了变量的本质是操作内存地址,才能更好的理解C语言里的swap函数。

还有一个是 “什么叫在栈里开空间?” 开空间在计算机里是个什么动作? 我们后面再讲。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/316213.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号