关于#c++#的问题,如何解决?

# include <iostream>
# include <string.h>

using namespace std;
 

int main()
{
     void swap(int *p1,int *p2);
     int a=1,b=2,*p1=&a,*p2=&b;
     swap(p1,p2);
     cout<<*p1<<endl;
    return 0;
}
void swap(int *p1,int *p2)
{
    int *temp;
    temp=p1;
    *p1=*p2;
    *p2=*temp;
}


# include <iostream>
# include <string.h>

using namespace std;
 

int main()
{
     void swap(int *p1,int *p2);
     int a=1,b=2,*p1=&a,*p2=&b;
     swap(p1,p2);
     cout<<*p1<<endl;
    return 0;
}
void swap(int *p1,int *p2)
{
    int *temp;
    temp=p1;
    p1=p2;
    p2=temp;
}


为何第一个输出结果是2,第二个输出结果是1

第一段代码中:
temp=p1; temp指向了p1指向的内存
*p1=*p2; 是把p1指向的内存的数据更新成了p2内存中的数据,因为temp指向p1的内存,所以这时候
temp指向值也已经发生了改变,temp内存的值也更新成了p2内存中的数据
*p2=*temp这里,让p2内存的数据等于temp内存的数据,因为temp本身存的就是p2内存的数据,所以,这一句话基本没什么用
所以,这段代码只是让p1的数据更新成了p2的数据,但是p2的数据没有更新成p1的数据。

第二段代码中:
交换的是地址,对main函数中p1和p2内存中的数据没有影响,所以*p1仍然是1。

如果要实现交换,正确的写法是:

void swap(int* p1 ,int* p2)
{
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

第一种方法是交换了p1,p2两个指针指向的内存的内容,即原来p1的内存是"1",被换成了p2原来所指的"2",p2指向的内存内容被换成了"1"
第二种只是交换了指针所指的地方,值不发生变化

第一种:
假设p1指向ADDR1,p2指向ADDR2

地址交换前交换后
ADDR112
ADDR221

第二种
ADDR1,ADDR2所指的内存内容不变,p1,p2字面上交换了位置,p1->ADDR2;p2->ADDR1,然而作为形式参数它们函数退出就不存在了,因此主函数里的p1,p2跟函数参数里的p1p2没关系,所指的内存以及内存内容不变,所以值不变

第二个交换的只是swap()函数中p1和p2指向的地址.不会影响main主函数中p1和p2指向的地址.也不会改变ab的值.

而第一个代码*p1=*p2是把p2指向地址中的值赋值给p1指向的地址中.这样会改变a的值.

第二个函数是不能实现外部数据的交换的,但第一个可以
因为第一个是进行指针指向的值的交换,这是可以的。但第二个进行的是指针的交换,这是不能实现外部传入参数的数据改变的。简单点说,指针作为参数时,函数内是改变不了传入指针本身地址的