C语言中函数调用,为什么交换了地址,可是所指的值还是不变那????

求函数的运行结果
#include<stdio.h>
void swap(int*a,int*b)
{int*t;
t=a;a=b;b=t;
}
main()
{int x=3,y=5,*p=&x,*q=&y;
swap(p,q);
printf("%d%d\n",*p,*q);
结果是35
照例来说虽然被调用函数没有返回值,但是指针所指的地址不是发生了交换吗。。那*p和*q所指值不是也应该发生变换吗,应该是53啊。。。各位不好意思我能悬赏的分不多。。但还是希望好心人能够详细点解释下。要考二级了

#include<stdio.h>

void swap(int *a,int *b)

{

  int t=0;   

   t=*a;

   *a=*b;

   *b=t;

}

int main()

  int x=3,y=5;

  int *p=&x,*q=&y;

  swap(p,q);

  printf("%d %d\n",*p,*q);

  printf("%d %d\n,a,b);  //看看是不是 a,b也改变了!~!

}

你那个错误,我的估计: 你可以用vc++单步调式一下.也可以完全理解的.

p=&x  就是把  x的地址保存在 指针 p中.  *p 就是得到  值. *p=3.

q也差不多.

你下面  sqap(p,q) . 就是把地址传过去了.

可是传回来的值没有改变,为什么呢!

原因很简单.

因为你的 

int *t;

int*t;

t=a;a=b;b=t;

交换的是  a和b 的地址.

不要忘记了,当调用一个函数时.

os会为  swap 函数中的  int *a,int *b.开辟内存.

你改变的是swap开辟的内存.并没有改变 main中的*p和*q内存区域.

我再说清楚点.

p 保存的是 &a    q保存的是  &b

swap函数   a 保存的也是 &a    b保存的也是&b   

                  你用交换了 a和b的 地址.有什么用.没有改变原来的地方的地址.

只是改变了你自己的 a 和 b里面的地址.   没有改变那边的 真正的  3 和 5.

如果用了   

int t;

 t=*a;

 *a=*b;

 *b=t;

就是间接去改变那边的值.

通过里面 &a,&b,的地址来找到  真是的 3,5  然后就改变了.

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-02
你对函数调用和参数传递还不是很理解
1.首先函数调用的参数有形参和实参之分
swap(p,q);//p q为实参
void swap(int*a,int*b)//a b为形参
{int*t;
t=a;a=b;b=t;
}
2.指针变量名表示的是变量的值,这个值是其他变量的地址,而不是指针变量本身所在内存空间的地址
如:
int a;//定义整型变量,假设其地址为0xaaaaaaaa
int *p;//定义一个指针变量p,肯定要为其分配内存,假设为0xffffffff,还没初始化,里面的数据是不确定的。
p=&a;//p表示的0xffffffff里面的数据,是a的地址,执行后0xffffffff里面的数据变成a的地址,即0xaaaaaaaa
*p=5;//往a里写入数据

3.形参跟实参是不同的变量,占用不同的内存空间
所以a b已经是两个跟p q不同的变量了。
只不过是值跟他们相等罢了。
就如int m,n;
m=n; 你能说m和n是同个变量么?
4.既然形参和实参是不同的变量,
t=a;a=b;b=t;
交换a b的值(交换存储在a b指针变量里的数据,这个数据是地址,变成a跟q指向同一个对象,b q指向同一个对象)不会影响到p q的值
int t;
t=*a;*a=*b;*b=t;//交换a b指针变量里的地址所指向的数据,这样才能交换。
第2个回答  2011-03-02
main函数中
指针变量 p的值是 变量x的地址 ,即p指向x
指针变量 q的值是 变量y的地址 ,即q指向y

main函数 调用swap函数传入的参数 是 p 和q ,是以传递值的方式调用的
swap函数的形参 a和 b也是 指针变量 ,
调用 是a的值等于 p的值 ,b的值等于 q的值
即 a 指向main函数中的变量x
b 指向main函数中的变量y

swap函数 交换 a 与b的值
交换前 a指向x,b指向y;交换 后 a就指向了y,而b指向了x

a b的交换 并没有 改变 main函数中 p 和q的指向!

改为
#include<stdio.h>
void swap(int **a,int **b) //形参改为指向指针的指针
{int *t;
t=*a;*a=*b;*b=t; // a的值现在是 指针p的地址 ,*a就是 变量p,*a 和 *b交换 就是 p交换q
}
main()
{int x=3,y=5,*p=&x,*q=&y;
swap(&p,&q); // 传 p、q的地址 ,而不是 传p、q的值
printf("%d%d\n",*p,*q);
}
第3个回答  2011-03-02
这说明你对函数调用,形参和实参这块还是没掌握好,函数调用只是你p,q作为形参传了过去,也就是a,b首先得到了p,q地址,然后a,b地址交换。但是p,q本身没变,这样你主函数里调用没有返回值的swap()函数,结果让输出p,q当然没变化了,
可以这样修改:你把地址交换过程在主函数里实现,不调用。这样不需返回值直接能交换p,q。或是像一楼那样改的,在里面实现数值重新复制也行。
第4个回答  2011-03-02
完全不是那么回事!!
你函数里面应该是交换地址所指的内容,地址本身是个型参,你这样做结果就跟你传值是一样的效果了
这样改吧
void swap(int*a,int*b)
{int t;
t=*a;*a=*b;*b=t;
}
如果你要修改指针 则应该传入指针的地址 如下:
void swap(int**a,int**b)
{int *t;
t=*a;*a=*b;*b=t;
}
swap(&p, &q);
相似回答