该系列文章内容可能来源我本人或者zhrmoe(他的主页:https://zhr.moe)的编写。文章如果有错误欢迎批评指正,谢谢!转载请注明来自本站,另外,本系列教程中的代码建议初学者自己手打一遍,不要直接复制(由于某些奇怪的原因可能会导致你复制的代码出现错误!相信自己的双手吧=-=
如果你觉得进度太快,可以等你熟悉了前面的内容后再继续往下看
上次我们说到,指针的一个用途,可以当作参数传递给函数进行使用,废话不说,直接上代码
0 1 2 3 4 5 |
void swap2(int *pa, int *pb) { int t = *pa; *pa = *pb; *pb = t; } |
一定要记的上次说的,星号的两种使用,一种是在声明的时候,代表变量类型为指针,第二种是使用的时候根据指针所指的地址间接取值。同理,在参数的声明时候也一样。在上面的代码中,声明了两个参数,类型都是整数指针,也就是将要储存整数变量所在地址的变量(有点绕,配合上次的内存截图理解),接下来的三行是整数交换的操作。注意,t是一个局部的整数变量,pa是个整数指针,只有间接取值的结果才是一个整数。同理,*pb代表的是pb指向位置的内容,这是第三个星号的使用:间接的存储。这三行看似简单,但是如果不能理解指针就会非常容易出错,究竟是不是应该加星号是最容易纠结的地方。接下来的几张图将表示函数执行的过程(图中的地址只是为了便于理解,并不符合真实内存的分配规律,上次的截图才是真实的内存状态)。
假设两个数 a = 1, b = 2,调用语句是这样的swap2(&a, &b); 这样就传入了两个变量的地址。
传入的地址的值会被原封不动复制到pa和pb两个新的指针变量的内容中,如上图
第1行,分配一块内存当作t,并且存入pa所指向的内容,如上图
第2行,改写pa指向地址的值,如上图
第3行,改写pb指向地址的值,如上图
最后, 函数结束,回收pa,pb,t三个变量占用的内存,如上图
这就是通过传入地址来间接交换两个变量,你可以用下面的代码观察结果
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <stdio.h> void swap1(int a, int b) { int t = a; printf("In swap1:\n"); printf("a = %d, b = %d\n", a, b); a = b; b = t; printf("a = %d, b = %d\n", a, b); printf("swap1 end\n"); } void swap2(int *pa, int *pb) { int t = *pa; printf("In swap2:\n"); printf("a = %d, b = %d\n", *pa, *pb); *pa = *pb; *pb = t; printf("a = %d, b = %d\n", *pa, *pb); printf("swap2 end\n"); } int main() { int a = 1; int b = 2; //int *pa = &a, pb = &pb;(注意这是错误的写法,每个变量声明都要加星号) int *pa = &a, *pb = &b; printf("In main:\n"); printf("Before swap1\n"); printf("a = %d, b = %d\n", a, b); swap1(a, b); printf("a = %d, b = %d\n", a, b); printf("Before swap2\n"); printf("a = %d, b = %d\n", a, b); swap2(&a, &b); printf("a = %d, b = %d\n", a, b); printf("main end\n"); system("pause"); return 0; } |
为了更好的理解值传递,下面的几张图将表示上一次的交换函数执行过程,也就是上面代码中的swap1,一样假设两个数a = 1, b = 2(图中的地址只是为了便于理解,并不符合真实内存的分配规律,上次的截图才是真实的内存状态)。
—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————
参数传入后会像上次说的那样原封不动的复制一份到新的参数中,虽然同名(也可以不同名),但是本质上已经不是同一个变量了, 如上图所示
—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————
—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————
—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————
—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————
最后, 函数结束,回收a,b,t三个变量占用的内存,如上图
—————————我 是 萌 萌 哒 分 割 线 ●▽● ———————————
下次介绍指针与数组的关系
0 Comments