基础比我想得重要,一不注意就出错了,而且真的不好找……今天就犯了一大打错,写交换函数的时候写错了,沉重的打击了我幼小的心灵……哎,是这样的。
//这是一种错误的写法,形参传进来的是实参的地址,temp如果被赋值为a的地址
//然后a指向的内存中的值是b指向的内存中的值,这一步是半成功的,因为,同时temp与a指向的内存相同,*temp和*b的值一样……
//a原本指向的内存中的值被更改的,不知道去哪里了,运行结果会发现,本想着交换的两个值,变得一样。
void swap(int *a, int *b)
{
int *temp = a;
*a = *b;
*b = *temp;
}
//这也是一种错误的写法,在这里temp里面是a的地址,a被赋予b的地址,然后b又被赋予a的地址
//然后函数结束,a,b,temp被回收……然后就是跟实参毛线关系也没有……
void swap(int *a, int *b)
{
int *temp = a;
a = b;
b = temp;
}
//这才是正确的写法,引入地址后,解引用,直接对这个内存中存的内容做改动
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//和上面类似的还有这个,交换两个指针,意义是相同的,传进来两个指针的地址,
//对这个地址做解引用后,对指针本身做改动。
//这也是正确的写法
void swap1(int **a, int **b)
{
int *temp = *a;
*a = *b;
*b = temp;
}
用图来解释一下,感觉画的没什么用呀。
大致意思和代码中说的差不多,看图更明显,传进来的地址,是不能直接对该地址做改动的,如果需要改动,得通过地址的地址。我们的目的是,通过传进来的地址,做解引用,这样就可以改动内存里面的数据了。
当然更方便的方式就是采用引用,但作为显得有点low,是吧?