大家在学习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函数。
还有一个是 “什么叫在栈里开空间?” 开空间在计算机里是个什么动作? 我们后面再讲。