给你来点通俗点的:
有个关键的东西你没有考虑到,函数里的a与函数外的a并不是一个a,请看:
int a = 3;
int b = 5;
void fun(int *A,int *B)
{
int *C; // 1
C=A; // 2
A=B; // 3
B=C; // 4
}
fun( &a, &b );
我们来看一下,运行1,2,3,4句话的结果
1. int *C;
+ &a 0x00424a30 int a
+ &b 0x00424a34 int b
+ A 0x00424a30 int a
+ B 0x00424a34 int b
+ C 0xcccccccc
2. C=A;
+ &a 0x00424a30 int a
+ &b 0x00424a34 int b
+ A 0x00424a30 int a
+ B 0x00424a34 int b
+ C 0x00424a30 int a <--改变
3. A=B;
+ &a 0x00424a30 int a
+ &b 0x00424a34 int b
+ A 0x00424a34 int b <--改变
+ B 0x00424a34 int b
+ C 0x00424a30 int a
4. B=C;
+ &a 0x00424a30 int a
+ &b 0x00424a34 int b
+ A 0x00424a34 int b
+ B 0x00424a30 int a <--改变
+ C 0x00424a30 int a
从上面的调试结果可以看出来,&a &b的值一直没有改变,在改变的只是函数内部A B的值。一旦函数结束,a, b的值是不是还是没有改变?
在进入fun之前,会有个拷贝的过程 A <-> &a, B <-> &b,很多时候都是会将外部变量和参数写成一样,就很容易造成困扰,其实函数内外根本不是一个东西。
A 和 &a 都指向同一个地址是没有错,但你把A的指向改变下,&a的指向你可是没有变吧。
换一下,用 *A 和 a来比较 A指向的那个内容就是a,修改*A就是修改a
所以在一些情况下(如COM中),就会有一些函数的参数是 void** ppObj,只有这样才能将传进去的一个指针的值改变。
记住关键:函数内部的变量与函数外部的变量是相互独立的。
函数是传址进去的,但是在函数内部,你只是交换了局部指针a和b的地址,而没有交换到p和q指针所指向的地址,同样也没有交换到x和y的地址,因此最后输出的是没有交换的值。
给你来点通俗点的:
有个关键的东西你没有考虑到,函数里的a与函数外的a并不是一个a,请看:
int
a
=
3;
int
b
=
5;
void
fun(int
*A,int
*B)
{
int
*C;
//
1
C=A;
//
2
A=B;
//
3
B=C;
//
4
}
fun(
&a,
&b
);
我们来看一下,运行1,2,3,4句话的结果
1.
int
*C;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a30
int
a
+
B
0x00424a34
int
b
+
C
0xcccccccc
2.
C=A;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a30
int
a
+
B
0x00424a34
int
b
+
C
0x00424a30
int
a
<--改变
3.
A=B;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a34
int
b
<--改变
+
B
0x00424a34
int
b
+
C
0x00424a30
int
a
4.
B=C;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a34
int
b
+
B
0x00424a30
int
a
<--改变
+
C
0x00424a30
int
a
从上面的调试结果可以看出来,&a
&b的值一直没有改变,在改变的只是函数内部A
B的值。一旦函数结束,a,
b的值是不是还是没有改变?
在进入fun之前,会有个拷贝的过程
A
<->
&a,
B
<->
&b,很多时候都是会将外部变量和参数写成一样,就很容易造成困扰,其实函数内外根本不是一个东西。
A
和
&a
都指向同一个地址是没有错,但你把A的指向改变下,&a的指向你可是没有变吧。
换一下,用
*A
和
a来比较
A指向的那个内容就是a,修改*A就是修改a
所以在一些情况下(如COM中),就会有一些函数的参数是
void**
ppObj,只有这样才能将传进去的一个指针的值改变。
void fun(int *a,int *b)
{int *c;
c=a,a=b;b=c;
}
你只是改指针,没改值,没有意义
改为:
void fun(int *a,int *b)
{int c;
c=*a,*a=*b;*b=c;
}
函数调用不改变传进去的实参的值,你的函数是void fun(int *a,int *b),在返回时不改变传入的实参fun(p,q)的值。你可以改为:
void fun(int *a,int *b)
{int *c;
*c=*a,*a=*b;*b=*c;
}
这样你改变的是指针指向元素的值,并没有改变指针的值。