有没有大佬能帮我解释一下这四个程序的区别,以及为什么会出现错误输出。

//错误输出
void swap(int * p1,int * p2)
{
    int * p;
    p=p1;
    p1=p2;
    p2=p;
}

//错误输出
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}


//正确输出
void swap (int * p1,int * p2)
{
int temp;
temp= * p1;
* p1= * p2;
* p2= temp;
}

//错误输出
void swap(int * p1,int * p2)
{
int * temp;
* temp= * p1;
* p1= * p2;
* p2= temp;
}
 

这个考查的就是指针作为函数参数的问题。要搞清楚局部变量作用域之类的。第一个直接交换的是p1,p2两个指针变量的值,注意是指针变量的值,而不是指针指向的内存中的值。第二个传入的是int类型,x,y是外部输入的拷贝,在函数内部确实实现了x,y的交换,但是x,y是外部的拷贝,修改x,y不会影响外部变量。第四个,int *temp没有初始化,就直接*temp=*p1,*temp指向不明确,算是野指针之类的,编译应该会有提示,实际执行到这一句应该会崩溃,而且最后应该是*p2=*temp.

* temp= * p1;这句话是错误的,因为temp之前已经定义成指针,用的时候只需用名字即可 不用*

void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}

这段程序为什么是错的呢? 虽然函数里面实现了x和y互换,但是不影响函数外部变量的值,函数执行完里面变量释放了

其他两个是正确的,主要是利用指针指向改变了变量

很简单,第一个函数内部交换指针的话,要求参数就得用指针的指针,不然无法实现对外部指针变量的交换。这和第二个类似,光是值参也是不行的。

第三个OK,指针作为参数,可以交换指针的内容

第四个temp都没分配空间呢,就*temp是不行的