你要用*去解引用,这样才能改变指针指向内存的值。
你的swap函数写的有问题,正确的写法有人给了。
至于为什么*x,*y的值没有改变,因为你交换的是2个形参的值,虽然你传入的是指针,但是你没有把它们当成指针来用,最后的结果跟传非指针值是一样的。
如果想真正改变实参的值,就必须交换指针指向的内存,而不是单纯交换指针变量本身。形参是通过堆栈传递的,只有用类似 *x = 1;这样的语句操作指针指向的内存,才能影响到实参,否则实参的值是不会改变的。
其实最好的方式就是去VS里调试运行,仔细观察运行过程,就能比较清晰地了解指针。单纯的理论是站不住脚的,拉出来溜溜就一清二楚了。
想对你能有帮助。
#include
void swop(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
int main(void)
{
int a = 3;
int b = 4;
int *x = &a;
int *y = &b;
swop(x,y);
printf("%d %d",*x,*y);
return 0;
}
你的交换函数有问题,首先交换顺序就错了,指针传递的是地址,t 要是值,才能将指针指向地址所代表的值进行交换
首先,void swop(int *x, int *y)传进是指针没错,但是,参数你可以这样理解,int* 是类型 x,y 是参数,
所以是传进swop的还是 x,y (x,y其实是数据所在的地址),亦是说,swop函数里交换你可以将
x y 地址指向的数据交换(t = *x ;*x=*y;*y=t ),但就不能交换 x,y 本身。
说得不清楚,写个例子吧
int add(int a,int b) 与int add(int * a, int *b);
这两者的参数类型是 int 与 int *
既然 第一个int add(int a,int b) 里的 a b 不能修改,那么 第二个int add(int * a, int *b)里的 a b 也肯定不能修改的咯
#include
void swop(int *x, int *y)
{
int *t = NULL;
t = x;
x=y;
y= t;
printf("%d\n",x);
printf("%d\n",y);
}
int main(void)
{
int a = 3;
int b = 4;
int *x = &a;
int *y = &b;
printf("%d\n",x);
printf("%d\n",y);
swop(x,y);
printf("%d\n",x);
printf("%d\n",y);
printf("%d%d",*x,*y);
}
拿去试试你就知道了,为什么了,注意观察内存地址的变化
swap函数接收的只不过是原先x y中的内容,而这个内容,就是 3,4 的地址,对吧
swap将得到的地址进行交换,swap函数在栈上执行,执行完就销毁了,不会影响到真正的3 和4,
你再看看这个,传过去的是x,y的地址,swap就能通过这个x y的地址找到 3 4的地址,这样就能真正的操作到3 4 了
#include
void swop(int **x, int **y)
{
int *t = NULL;
t = *x;
*x=*y;
*y= t;
printf("%d\n",x);
printf("%d\n",y);
}
int main(void)
{
int a = 3;
int b = 4;
int *x = &a;
int *y = &b;
printf("%d\n",x);
printf("%d\n",y);
swop(&x,&y);
printf("%d\n",x);
printf("%d\n",y);
printf("%d%d",*x,*y);
}
一楼的解释更加清楚明白