----------------------------------------记录一下学习过程----------------------------------------------------
先来看一下没有用到指针传递的函数:
对于初学者来说
void change(int p1, int p2) {
int p;
p = p1;
p1 = p2;
p2 = p;
}
void main() {
int a, b;
a = 1;
b = 2;
printf("改变前的a=%d,b=%d\n",a,b);
change(a, b);
printf("改变后的a=%d,b=%d",a,b);
}
看到该函数,就会想到运行结果为
实际上该函数运行的结果为:
为什么会这样呢?
这里就要引入两个概念:形参和实参,代码void change(int p1,int p2)里面的p1,p2是形参,而main函数里面给change传递的a,b则为实参。
该程序运行时,首先会在内存中创建两个实参a与b,接着把实参传递到chang(int p1,int p2)函数中,该传递是复制,即系统会开辟另一个地址给p1与p2, 然后让p1的值与p2的值和a,b相等。这样就相当于有四个变量,在chang()中,改变的只是p1与p2而对main()中的a和b没有影响,所以a与b的位置并没有交换。画图表示为:
接下来对程序进行稍微修改有:
void change1(int &p1, int &p2 ) {
int p;
p = p1;
p1 = p2;
p2 = p;
}
void main() {
int a, b;
a = 1;
b = 2;
printf("改变前的a=%d,b=%d\n",a,b);
change1(a, b);
printf("改变后的a=%d,b=%d",a,b);
}
可以看到对程序仅有的改动是change1(int &p1,int &p2),change1的参数发生了变化,加入了"&",该参数的意思是“引用”p1与p2引用a与b,而不是给p1与p2新开辟一个空间此时此时,运行的结果为:
图画为:
void change2(int *p1,int *p2) {
int* p;
p = p1;
p1 = p2;
p2 = p;
}
void change3(int* p1, int* p2) {
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}
void main() {
int a, b,c,d;
a = 1;
b = 2;
c=1;
d=2;
printf("改变前的a=%d,b=%d\n",a,b);
change2(a, b);
printf("改变后的a=%d,b=%d\n\n",a,b);
printf("改变前的a=%d,b=%d\n",a,b);
change3(c, d);
printf("改变后的a=%d,b=%d",c,d);
}
接着看这些代码:
运行的结果为:
可以看到change2并没有发挥作用,而chang3却发挥了作用 。