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

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

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

相关推荐