你是不是也卡在指针这块了?看到 * 和 & 就头晕,好不容易写了段代码还总报内存错误,网上搜 “C 语言指针怎么学”“内存管理常见问题”,出来的答案要么太复杂要么不实用。别慌,兔子哥当年学的时候,对着指针发呆了快一个星期,后来慢慢摸出点门道,今天就把这些实战技巧跟你说说,全是能直接用的法子。
先说说指针,很多人觉得它难,其实是没搞懂指针到底是个啥。你就把它想成一个小纸条,上面写着东西放的位置。比如你家抽屉里有块糖,指针就是那张写着 “左边第二个抽屉” 的纸条。咱们操作指针,就是通过这个位置去找东西、改东西。
怎么练指针呢?我有个笨办法,拿张纸画出来。比如:
int a = 10;
int p = &a
你就在纸上画个盒子写 a=10,旁边画个小纸条 p,纸条上写着 a 盒子的地址(随便编个数字比如 0x1234)。然后看p 的时候,就顺着纸条上的地址找到 a,这样就好理解多了。
| 操作 | 意思 | 新手常错写法 |
|---|---|---|
| int *p | 声明一个指向 int 的指针 | int p*; |
| p = &a | 把 a 的地址给 p | p = a; |
| *p = 20 | 把 p 指向的地方改成 20 | p = 20; |
你看,很多人会把 * 的位置写错,或者把地址和值弄混。记住,& 是拿地址,* 是根据地址找东西,多写几遍就顺了。
再来说内存管理,这块最容易出问题,程序崩了十有八九是它的锅。malloc 出来的内存一定要 free,就像借了东西要还,不然借多了就没了,程序就跑不动了。但也不能 free 两次,就像还了的东西不能再还一次,会出乱子。
我给你列几个实战中要注意的点:
- malloc 之后先检查是不是 NULL,万一内存不够呢?比如:
int p = (int) malloc (10*sizeof (int));
if (p == NULL) { printf ("内存不够啦"); return; } - 数组越界是大坑,比如你 malloc 了 10 个 int 的位置,就别去用 p [10],那已经超出范围了。
- 指针不用了就设成 NULL,比如 free (p) 之后加一句 p=NULL,免得变成野指针到处乱指。
你知道吗,很多老手也会在内存管理上栽跟头。我之前维护一个程序,就是因为少了个 free,跑一天就卡死,查了半天才找到。所以最好养成习惯,写 malloc 的时候就想好在哪 free,像记购物清单一样。
可能有人会问,怎么知道自己内存用错了?简单,程序崩了的时候看看提示,要是出现 “segmentation fault”,多半是指针指到不该指的地方了。这时候回头检查最近写的指针操作,特别是数组访问和函数传参的地方。
还有个小技巧,用 printf 打印指针的值看看。比如 printf ("% p", p),能看到指针指向的地址,对比一下是不是你预期的,有时候一眼就能发现问题。
兔子哥觉得,指针和内存管理这东西,光看没用,必须动手写。从简单的开始,比如用指针遍历数组,慢慢过渡到动态分配内存。错了别怕,每错一次就记下来,下次就知道怎么躲坑了。我当年就是这么一点点磨出来的,现在写指针操作,基本不会出大问题。你也别着急,多练几周,肯定能突破这个难关。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~