是不是一翻开 C 语言教程的指针章节,就感觉像看天书?和 & 长得差不多,偏偏意思完全不同;好不容易记住了 “指针是地址”,一写代码还是分不清 p 和p;调试的时候要么是 “段错误”,要么输出一串乱码,对着屏幕发呆半天也找不出错在哪。其实啊,指针是 C 语言里出了名的 “拦路虎”,不光你觉得难,很多程序员刚学的时候都栽过跟头。兔子哥当年学指针,对着一段代码看了三天才勉强明白,今天就把自己的笨办法分享出来,帮你捅破这层窗户纸,一起往下看吧!
先别怕:指针难理解,真不是你的问题
很多人学不会指针,就觉得是自己笨,其实不是这样的。指针这东西,本身就很抽象,它不直接对应生活里的东西,不像变量可以对应 “盒子”,循环可以对应 “重复做事”。而且教材里总说 “指针是内存地址”,可内存地址这东西看不见摸不着,光靠想象确实难。
你想啊,我们平时说话都是 “把苹果放盒子里”,没人会说 “把苹果放到第 3 排第 5 个格子里”—— 可指针就是在说 “第 3 排第 5 个格子” 的事,能不难吗?所以啊,学不会指针很正常,别灰心,咱们换个思路就行。
用生活例子打比方,指针其实很简单
别死磕 “内存地址” 这四个字,用生活里的东西类比,一下子就通了。
- 指针就像门牌号:你家的房子是变量,门牌号就是指针。比如变量 a 住在 “101 号”,那指针 p 就可以记着 “101 号”。*p 就相当于 “101 号房子里的东西”,也就是 a 的值。
- & 符号是 “查门牌号”:&a 就是 “查 a 住的门牌号”,所以 p=&a 就是 “让 p 记着 a 的门牌号”。
- 指针变量也有自己的门牌号:就像门牌号本身也贴在墙上(有自己的位置),指针 p 作为变量,也有自己的地址,不过刚开始不用管这个,先学会用 p 记别人的地址就行。
试试用这个比方套代码:
c运行
int a = 10; // a是房子,里面放着10int *p; // p是门牌号本,专门记门牌号p = &a; // 把a的门牌号写到p上printf("%d", *p); // 看看p记的门牌号里的东西,就是10是不是清楚多了?我当年就是靠这个比方,才分清了 p 和 * p 的区别。
最容易搞错的 3 个点,一个个攻破
指针里的坑就那么几个,把它们揪出来,逐个解决就行。
| 易错点 | 错误写法 | 正确写法 | 为啥错 |
|---|---|---|---|
| 指针没初始化 | int *p; *p=5; | int a=5; int *p=&a *p=10; | 没初始化的指针不知道指哪,乱赋值会出问题 |
| 漏写或多写 | int *p=&a printf("%d", p); | printf("%d", *p); | p 是门牌号,*p 才是里面的东西 |
| 数组名当指针用错 | int arr[5]; int *p; p=arr[0]; | p=arr; 或 p=&arr [0]; | 数组名本身就是首地址,不用加 [0] |
比如第一个错,很多人刚学就写 “int *p; *p=5;”,这就像拿着空白门牌号本,硬说 “这个门牌号里有 5”,谁知道你说的是哪个门牌号?程序不报错才怪。
学指针要动手画,光看代码没用
指针看不见摸不着,最好的办法是动手画出来。拿张纸,画几个方框当变量,旁边标上门牌号(地址),指针就画个箭头,指向它记的地址。
比如这段代码:
c运行
int a = 20;int b = 30;int *p = &a;p = &b;画图步骤:
- 画方框写 a,里面写 20,旁边标地址 0x1000;
- 画方框写 b,里面写 30,旁边标地址 0x1004;
- 画指针 p,刚开始箭头指向 0x1000(a 的地址);
- 执行 p=&b 后,箭头改指向 0x1004(b 的地址)。
一画就明白,p 只是改了指向,a 和 b 的值根本没变。我当年学指针,画了满满一个笔记本的图,后来看到代码脑子里就能自动出图了。
新手该练哪些题?从简单到复杂,别着急
一开始别碰复杂的指针数组、多级指针,先把基础题练熟。
- 第一阶段:用指针改变量的值。比如写个函数,用指针交换两个数,这种题能帮你理解指针传参。
- 第二阶段:指针和数组结合。比如用指针遍历数组、找最大值,数组名是地址这一点,练 10 道题就能记住。
- 第三阶段:字符串和指针。比如用指针统计字符串长度,比数组下标更直观,还能为后面学库函数打基础。
有人问 “直接学多级指针行不行?” 我的建议是别。就像还没学会走就想跑,很容易摔跟头。我当年跳过基础题直接学指针数组,结果越学越乱,后来退回去从交换两个数开始练,反而快了。
不过话说回来,指针再难也有套路,你看那些复杂的指针代码,拆开了都是 “指针指向谁”“怎么取值”“怎么移动” 这几个问题。就像搭积木,再复杂的造型,也是一块一块拼起来的。
最后说点我的看法。学指针没有捷径,就是多画图、多敲代码、多犯错。错得越多,记得越牢 —— 我当年因为指针写错,程序崩溃了不下五十次,现在看到指针代码反而觉得亲切。别指望一天就搞懂,给自己点时间,这周懂指针变量,下周懂指针传参,慢慢就通了。实在搞不懂某道题,放两天再看,可能突然就明白了。希望能帮到你,有啥卡壳的代码,随时找我聊聊。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~