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函数。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值