如图所示的(大小调换)
不知道为什么不能调换,还是原样
但是如果改成这个样子,就可以进行掉换了
不知道为什么第一个不能调换,想求解一下
p1传上去的是指针变量,p1对应值为指针指向的地址,*p1表示p1指向地址中存储的值,其他同理
基于第一个,指针相当于俩个人的门牌号,你把两个门牌号交到警察局,本来是想让警察根据门牌号去他家让他们交换位置,但是警察只是在警察局里面把门牌号左手右手互换了一下,都没出门。警察局外面的两个人门牌号没变,房子里的人也没变。
你可以去相关资料或者百度了解一下函数按值传递(拷贝),按址传递(传递的是地址),按引用传递(别名,最优)。
也就是说,假如外面定义一个变量,通过参数传递,在函数内部修改,外面能识别到函数内部的修改,这个知识点。
你要知道 int* 实际指向的是一个地址 然后 真正调用时 swap(&a, &b); 实际上是拷贝传值的,吧&a表示的地址拷贝了一份,(但是拷贝的是地址,也就是实际传递的是地址)
void Swap(int *p1, int * p2) {}
你如果操作的是地址中指向的值,对其指向的地址中保存的内容进行调换,(传参地址没变,地址中的值变化了,实际交换成功),也就是改了原参数地址对应的值,必然生效。
但是你如果操作的是这里的地址,注意swap(&a, &b); &a 和原来的int a的地址值相同,但其实是拷贝了一份当函数参数去做使用的,你操作的是这个拷贝后的一份数据,与原数据没有关系了。。。
(这是函数传参最重要的一个知识点,也比较绕,重点要了解默认是拷贝按值传参,内部生效,要传进去地址或者引用的方式)你可以找资料整理一下。
有用的话,我也想被采纳。
第一种写法实际上只是交换了参数中两个指针的值,并未交换指针指向的内存的地址的值。
函数两个参数p1和p2,如果有如下调用:
int a=1, b=2;
swap(&a, &b);
进入函数swap后,
p1指向a,即p1指针变量中存放的是a的地址;
p2指向b,即p2指针变量中存放的是b的地址;
函数里面只是交换了函数swap中临时的指针变量p1和p2两个指针的值,交换之后,p1指向b,p2指向a,并未改变a和b内存的内容,所以a和b的值并未改变。