用指针实现数字a和数字b的互换

来源:互联网 发布:淘客qq群发软件 编辑:程序博客网 时间:2024/05/29 07:37

声明:本文所用的代码来自郝斌老师的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。


0 0
原创粉丝点击