赞
踩
声明:本文所用的代码来自郝斌老师的C语言自学视频
我是一名C语言的初学者,非常喜欢听郝斌老师的C语言视频课程,今天下午我终于弄明白怎样使用指针来实现数字 a 和 数字 b 的互换了。
其实,这是个非常简单的程序,可以不用写任何函数就能实现的程序:
int main(void)
{
int a = 3;
int b = 5;
int t;
t = a;
a = b;
b = t;
printf("a = %d, b = %d\n", a, b);
}
上面的程序就完全可以实现数字 a 和数字 b 的互换功能的,但是为了深刻的理解指针的重要作用,我们要尝试利用指针来实现数字 a 和数字 b 的互换功能。
首先来看下面的程序:
void swap_1(int p, int q)
{
int k;
k = p;
p = q;
q = k;
return;
}
int main(void)
{
int a = 3;
int b = 5;
swap_1(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
这个程序乍一看是合理的,其实,它并不能实现数字 a 和 数字 b 之间的转换。原因如下:
程序从 main 函数进入,当程序执行到 swap(a, b) 时,程序会把变量 a 的值 3 发送给变量 p ,把变量 b 的值发送给变量 q, 而 swap 函数实现的功能是将变量 p 和变量 q 的互换,而变量 a 和变量 b 的值并没有互换。(因为我们只是将 a 的值 3 和 b 的值 5 分别发送给了内存的另一个变量区域了,而 a 和 b 所在位置的变量区域的值并没有改变)。
需要明确的是,我们 需要互换的是位于变量 a 和变量 b 处的区域内部的值互换(我们要互换的是变量的内容)。那么怎样实现内存中变量 a 所在的区域的值和变量 b 所在区域的值的互换呢?什么能和变量的位置(专业一点说是地址)来扯上关系呢,这就是我们要用到的指针了。
首先我们写一个新的互换函数,名字就叫 swap_2。看下面的程序吧:
void swap_2(int * p, int * q)
{
int k;
k = * p;
* p = * q;
* q = k;
return;
}
int main(void)
{
int a = 3;
int b = 5;
swap_2(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
这个程序是这样理解的:
p 是一个指针变量,指向的是变量 a 的地址,比如说我们可以姑且把 a 的地址假定叫做 1000H, q 也是一个指针变量, 指向的是变量 b 的地址, 我们姑且可以把 b 的地址假定叫做 2000H。当程序执行到 swap_2(&a, &b) 这一行时,就会把 a 的地址 1000H 和 b 的地址 2000H 分别发送给 int * 型的变量 p 和 q。而 *p 和 *q 是等同于变量 a 和 b 的。所以, a 和 b 的内容就实现互换了。swap 函数处理的是 a 和 b 内存区域中的内容,所以要把地址发送给函数 swap_2。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。