user-0 提问: 菜鸟的悲哀 之 换不了的指针值[求大虾指点!]

回复:
user: user-1
content: 个人理解：“swap(pa,pb);     //调用swap函数交换指针pa与pb的值”此处的awap（）函数传进去的应该是数值，即swap（a，b），而不应该是你的pa，pb指针。 原因我的理解是：void swap（int *，int*）里面的参数是形参，若你传进来两个指针，那么p1，p2中存放的应该是pa，pb指针的地址，而不是pa，pb所指向的a，b的值，那么，以下的操作就是在交换pa，pb的地址了。因此对pa.pb的指向没影响，故结果都没变。 不知这样解释你理不理解，认不认同。

user: user-2

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2 赵老师的出现总能让我精神振奋

user: user-0
content: 引用 2 楼 xihu1364 的回复:传参问题----月经贴  LZ你试试传进来后 看看p1和p2的地址跟值  比较传之前和之后的值  http://ccjluff.blog.163.com/blog/static/3327022420134252379529/反复看了那篇文章3遍，文章很浅显，很快就看完了。但对于传值和传值的理解还是不十分确定。

user: user-3
content: pa -->&a  pb-->&b 在swap里面   tmp = pa; pa = pb; pb=tmp; 你这样只是交换了pa和pb指向的地址，让pb -->a pa-->b 要改变a和b的值 void swap(int *a, int *b ) { int tmp = *a; *a=*b; *b=tmp; }

user: user-4
content: /*swap3.c -- 使用指针完成交换*/ #include <stdio.h> void interchange(int * u, int * v); int main(void) { 	int x = 5, y = 10;  	printf("Originally x = %d and y = %d.\n", x, y); 	interchange(&x, &y);/* 向函数传送地址*/ 	printf("Now x = %d and y = %d.\n", x, y); 	return 0; }  void interchange(int * u, int * v) { 	int temp;  	temp = *u;/* temp得到u指向的值 */ 	*u = *v; 	*v = temp; }

user: user-5
content: void swap(int** p1,int** p2)      int* tem;     tem = *p1;    * p1 = *p2;    * p2 = tem; }试试这个

user: user-2
content: #include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-6
content: 原来的函数  void swap(int* p1,int* p2) //交换指针pa与pb的值 {     int* tem;     tem = p1;     p1 = p2;     p2 = tem; }   交换了指针p1 和 p2的值。(可以打印出p1, p2的值看看)。  楼主可能以为交换了指针p1, p2的值，那么p1，p2指向的值也交换了，这就错了。  其实调用swap时传入的参数只是传入了p1，p2的拷贝，并没有将p1, p2传进去。

user: user-7
content: 传参问题----月经贴  LZ你试试传进来后 看看p1和p2的地址跟值  比较传之前和之后的值  http://ccjluff.blog.163.com/blog/static/3327022420134252379529/

user: user-0
content: 补充一点，swap函数换成下面的就可以交换指针和原变量： void swap(int* p1,int* p2)//交换指针pa与pb的值 { 	int tem; 	tem = *p1; 	*p1 = *p2; 	*p2 = tem; } 这中间到底咋地啦！