废话不多说,直接上代码大家直接查看下列4个函数中,哪个代码是正确的那个能交换主函数中x,y的值:
//swap交换两个变量之间的值
//值传递 无法交换main函数里面的值
void swap1(int x,int y)
{
int ret=x;
x=y;
y=ret;
}
//地址传递,交换的是函数内部x,y的地址,外部没有受到任何影响
void swap2(int* x,int* y)
{
int *p=x; //p指向外部的x
x=y; //x指向外部y
y=p; //y指向外部x
//上面三步骤 仅仅改变了在函数内部的 x,y指针的变量
//外部的x,y的值没有受到任何的影响
}
//地址传递,交换的是值
void swap3(int* x,int* y)
{
int ret=*x;
*x=*y;
*y=ret;
}
//值传递 非法给一块没有初始化的空间赋值
void swap4(int* x,int* y)
{
int *p;
*p=*x;
*x=*y;
*y=*x;
}
#include<stdio.h>
int main(int argc, const char *argv[])
{
void (*p)(int* x,int* y); //定义一个函数指针
int x=55;
int y=66;
printf("调用函数前,x=%d,y=%d\n",x,y);
swap1(x,y);
printf("调用函数后,x=%d,y=%d\n\n",x,y);
p=swap2;
printf("调用函数前,x=%d,y=%d\n",x,y);
(*p)(&x,&y);
printf("调用函数后,x=%d,y=%d\n\n",x,y);
p=swap3;
printf("调用函数前,x=%d,y=%d\n",x,y);
(*p)(&x,&y);
printf("调用函数后,x=%d,y=%d\n\n",x,y);
p=swap4;
printf("调用函数前,x=%d,y=%d\n",x,y);
(*p)(&x,&y);
printf("调用函数后,x=%d,y=%d\n\n",x,y);
return 0;
}
上述情况中
只有swap3能实现交换x,y的值,运行结果为:
swap1()函数只在函数内部交换x,y的值,与外界x,y的值无关;
sawp2()函数在函数内部交换的x,y的地址,与外界x,y的地址和值无关;
swap3()函数在内部操作了外界 x,y 的值。成功交换x,y的值
swap4()函数在内部非法操作没有初始化的指针。即操作了野指针。会直接中断程序。