c语言学习手册中指针部分看不懂怎么办

admin C语言 5


翻开 C 语言学习手册,前面的变量、循环都还好,一翻到指针章节,眼睛就发直?int *p里的星号像个谜,p*p到底谁是谁?手册里说 “指针就是地址”,可地址又是什么东西?合上书脑子一片空白,再翻开还是不懂 —— 你是不是也被指针折磨得快放弃了?别慌,兔子哥当年学指针,盯着手册看了三天都没入门,后来用了几个笨办法,突然就开窍了。今天就把这些招儿分享给你,全是大白话,保证新手也能听懂,一起往下看吧!

一、为啥指针总让人晕?先搞懂手册没说透的 3 个底层问题


很多人学不会指针,不是笨,是没搞懂最基础的逻辑。手册里上来就讲语法,可这些底层问题不想明白,看再多代码也白搭。

1. 内存到底长啥样?把它想成一排排带门牌号的柜子


你可以把电脑内存想象成小区里的快递柜,每个柜子能放东西,还有个唯一的编号 —— 这编号就是 “地址”。变量就像你租了个柜子,比如int a = 10,就是在某个柜子里放了 10,这个柜子的编号(地址)可能是 0x0012ff44(不用记具体数字,知道是个唯一编号就行)。
那指针呢?指针变量也是个柜子,只不过它里面放的不是 10、20 这些数,而是别的柜子的门牌号。比如int *p = &a,就是说 p 这个柜子里,放着 a 的门牌号。这样想,是不是清楚多了?

2. *&到底是啥操作?一个 “取东西”,一个 “取门牌号”


手册里*叫 “解引用”,&叫 “取地址”,听着吓人,其实很简单:
  • &a就是取 a 的门牌号,比如 a 在 0x0012ff44,&a就等于这个数;
  • *p就是根据 p 里的门牌号,去对应的柜子里拿东西,比如 p 里放着 0x0012ff44,*p就等于 a 的值 10。

刚开始我总搞反,后来在纸上画了个表,一下子就记住了:
符号操作例子结果
&取变量的地址&aa 的门牌号(如 0x0012ff44)
*从地址取内容*p(p 里是 a 的地址)a 的值(如 10)

3. 指针变量为啥要分类型?int和 char不一样吗?


手册里说 “int 指针只能指向 int 变量”,为啥这么麻烦?你想啊,不同类型的变量占的柜子数量不一样:int 占 4 个柜子,char 占 1 个。指针知道类型,才能正确 “取东西”—— 比如 int指针一次会拿 4 个柜子的内容,char指针一次拿 1 个。要是类型错了,拿的东西就乱了。


二、手册里的指针代码看不懂?用 “拆解法” 啃,再难的代码也能拆明白


指针代码看着复杂,其实都是由简单部分拼起来的。把代码拆成小块,一步一步看,就不会晕了。

1. 从最简单的指针定义开始拆


手册里的int *p; p = &a,拆成两步:
  • 第一步int *p;:定义一个叫 p 的指针变量,它只能指向 int 类型的变量;
  • 第二步p = &a:把 a 的地址存到 p 里。

别被int *p里的星号骗了,星号是在说 “p 是指针”,不是说 p 里存的是星号啥的。你可以把int*当成一个整体,就是 “指向 int 的指针类型”。

2. 指针和数组放一起?先记住 “数组名就是地址”


手册里int a[5] = {1,2,3,4,5}; int *p = a;总让人懵。其实数组名 a 本身就是第一个元素的地址,相当于&a[0]。所以p = a就等于p = &a[0],这时候*p就是 a [0] 的值 1,p+1就是 a [1] 的地址,*(p+1)就是 2。
我当年记不住这个,就每天写一遍这个例子,写了五天,突然就记住了。有时候笨办法反而最管用。

3. 函数传指针看不懂?想想 “直接改柜子里的东西”


手册里的函数传指针,比如void change(int *p) { *p = 100; },调用的时候change(&a),a 的值就变成 100 了。这是为啥?因为传过去的是 a 的地址,函数里能直接找到 a 的柜子,把里面的东西改成 100。要是不传指针,传变量 a,函数里改的就是 a 的副本,原 a 不变。
你可以这么想:传变量像 “告诉别人你家有个苹果”,别人改不了你家的苹果;传指针像 “告诉别人你家地址”,别人能直接去你家把苹果换成梨。


三、光看手册不行,这 3 个笨办法帮你 “动手” 理解指针


指针是 “做” 会的,不是 “看” 会的。光看手册里的文字和代码,永远隔着一层,动手试试这几个办法,比盯着书看强十倍。

1. 拿张纸画内存图,把指针 “画” 出来


准备一张纸,画几排格子当内存,每个格子标上门牌号(比如 0x0001、0x0002)。定义变量就圈出对应格子,写上值;定义指针就圈个格子,写上它指向的变量的门牌号。比如:
  • 画格子 0x0001-0x0004:写 “a=10”(int 占 4 格);
  • 画格子 0x0005-0x0008:写 “p=0x0001”(p 是指针,存 a 的地址);
  • 这时候*p就是去 0x0001 拿 10,一目了然。

我当年学指针,画了满满一个笔记本的内存图,后来看到代码脑子里就能自动出图了。

2. 写最傻的代码,故意犯错再改


别总看手册里的正确代码,自己写点错的试试。比如:
c运行
int a = 10;int *p;*p = a; // 错了!p还没指向任何地址呢

运行这段代码会报错,这时候去查手册里的 “野指针” 概念,就知道为啥错了 ——p 没初始化,不知道指向哪个柜子,乱改会出问题。然后改成p = &a *p = 20;,看到 a 真的变成 20,印象会特别深。

3. 用 printf 打印地址和值,眼见为实


手册里说&a是地址,*p是值,你可以用代码打印出来看看:
c运行
int a = 10;int *p = &a;printf("a的地址:%p\n", &a); // 打印a的地址printf("p存的地址:%p\n", p); // 和上面一样printf("*p的值:%d\n", *p); // 打印10

运行后会发现,&ap打印的地址一模一样,*p就是 a 的值。眼睛看到了,就不容易怀疑了。


可能有人会问,学指针到底有啥用?手册里说 “指针能提高效率”,可新手哪懂这些。其实你现在不用管这些,先逼着自己搞懂,等做项目用到链表、函数传参时,自然就知道指针多重要了。
兔子哥觉得,指针就像学骑自行车,刚开始怎么都平衡不了,突然某天就找到了感觉。别指望看一遍手册就会,多画、多写、多错几次,肯定能学会。我当年卡了两周,后来突然就通了,你也一定可以。实在不行就歇两天,别死磕,有时候放松一下反而有新思路。希望这些办法能帮到你,加油!

标签: 学习手册 0x0012ff44

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~