C基础系列教程8——指针2

该系列文章内容可能来源我本人或者zhrmoe(他的主页:https://zhr.moe)的编写。文章如果有错误欢迎批评指正,谢谢!转载请注明来自本站,另外,本系列教程中的代码建议初学者自己手打一遍,不要直接复制(由于某些奇怪的原因可能会导致你复制的代码出现错误!相信自己的双手吧=-=
如果你觉得进度太快,可以等你熟悉了前面的内容后再继续往下看

上次我们说到,指针的一个用途,可以当作参数传递给函数进行使用,废话不说,直接上代码

 

一定要记的上次说的,星号的两种使用,一种是在声明的时候,代表变量类型为指针,第二种是使用的时候根据指针所指的地址间接取值。同理,在参数的声明时候也一样。在上面的代码中,声明了两个参数,类型都是整数指针,也就是将要储存整数变量所在地址的变量(有点绕,配合上次的内存截图理解),接下来的三行是整数交换的操作。注意,t是一个局部的整数变量,pa是个整数指针,只有间接取值的结果才是一个整数。同理,*pb代表的是pb指向位置的内容,这是第三个星号的使用:间接的存储。这三行看似简单,但是如果不能理解指针就会非常容易出错,究竟是不是应该加星号是最容易纠结的地方。接下来的几张图将表示函数执行的过程(图中的地址只是为了便于理解,并不符合真实内存的分配规律,上次的截图才是真实的内存状态)。

假设两个数 a = 1, b = 2,调用语句是这样的swap2(&a, &b); 这样就传入了两个变量的地址。

传入的地址的值会被原封不动复制到pa和pb两个新的指针变量的内容中,如上图

第1行,分配一块内存当作t,并且存入pa所指向的内容,如上图

第2行,改写pa指向地址的值,如上图

第3行,改写pb指向地址的值,如上图

最后, 函数结束,回收pa,pb,t三个变量占用的内存,如上图

这就是通过传入地址来间接交换两个变量,你可以用下面的代码观察结果

为了更好的理解值传递,下面的几张图将表示上一次的交换函数执行过程,也就是上面代码中的swap1,一样假设两个数a = 1, b = 2(图中的地址只是为了便于理解,并不符合真实内存的分配规律,上次的截图才是真实的内存状态)。

—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————

参数传入后会像上次说的那样原封不动的复制一份到新的参数中,虽然同名(也可以不同名),但是本质上已经不是同一个变量了, 如上图所示
—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————

—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————

—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————

—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————


最后, 函数结束,回收a,b,t三个变量占用的内存,如上图
—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————
下次介绍指针与数组的关系

0 Comments
Leave a Reply