是不是听到 “指针” 俩字就头大?课本上讲的 “指针是地址”“指针变量存储地址”,越看越迷糊?其实啊,指针是 C 语言里出了名的难点,新手学不会太正常了。兔子哥当年学指针的时候,卡了快两周,后来换了个思路,突然就开窍了。今天就跟大家说说,指针到底该怎么学才容易懂,全是大白话,保证你能看明白。
先搞明白:指针到底是个啥?别被专业词吓住
很多人学不会指针,是被 “地址”“内存单元” 这些词唬住了。其实用大白话讲,指针就是个 “门牌号”。
你想啊,电脑的内存就像一栋楼,每个房间都有编号,这个编号就是地址。我们定义的变量,比如 int a=10,就相当于在这栋楼里租了个房间,房间号(地址)比如是 0x1234,里面放着 10 这个数。那指针变量呢?就是专门记这个房间号的小本本,比如 int *p,这个 p 就是小本本,你可以让它记着 a 的房间号,也就是 p=&a(& 就是取地址的意思,相当于抄门牌号)。
这么一说,是不是就好理解多了?指针变量本身也有自己的房间(地址),但它里面存的不是普通数字,是别的变量的地址。就像小本本自己也放在抽屉里(有位置),但小本本上写的是别人的门牌号。
| 普通变量(比如 a) | 指针变量(比如 p) |
|---|---|
| 存的是数据(10) | 存的是地址(&a) |
| 用变量名直接访问 | 用 * p 访问指向的数据 |
怎么用指针?分三步走,别着急
指针的用法看着复杂,其实拆成三步就简单了。
第一步,定义指针变量。格式是 “类型 * 指针名”,比如 int *p; 这里的 int 是说,这个指针只能指向 int 类型的变量,就像小本本只能记某一类房间的门牌号。注意啊,* 不是乘号,是 “指针” 的标志,可别搞错了。
第二步,给指针变量赋值。不能直接给个数,得给地址,也就是用 & 符号。比如 int a=10; int *p; p=&a 这样 p 就指向 a 了。要是写成 p=a,那就错了,这就像把房间里的东西当成门牌号写进小本本,肯定找不到地方啊。
第三步,通过指针访问变量。用 * p 就能拿到 a 的值,比如 printf ("% d", p); 会输出 10,和 printf ("% d", a); 效果一样。这里的是 “解引用”,意思是 “根据门牌号找到房间里的东西”。
你试试写这段代码,运行一下就明白了:
int main () {
int a = 20;
int *p; // 定义指针
p = &a // 指针指向 a
printf ("a 的值是:% d\n", a);
printf ("*p 的值是:% d\n", *p);
return 0;
}
运行结果会显示两个 20,是不是很神奇?
初学者常踩的坑,避开这些少走弯路
指针不难,但新手容易在这些地方栽跟头,兔子哥当年也犯过。
- 指针没初始化就用:定义了 int p; 就直接用p=10; 这时候 p 里存的是随机地址,可能指向电脑里重要的地方,一修改就容易让程序崩溃。解决办法:要么让它指向一个已有的变量,要么先赋值为 NULL(空指针,相当于没写门牌号)。
- 混淆 p 和 * p:p 是指针变量本身,存的是地址;*p 是指针指向的变量的值。比如上面的例子,p 存的是 a 的地址(比如 0x1234),p 存的是 20。打印 p 会输出一串数字(地址),打印p 才会输出 20。
- 指针类型搞错:用 int *p 去指向 float 类型的变量,虽然有时候能运行,但可能出问题。就像用记平房号的小本本记高楼号,可能对不上。尽量让指针类型和指向的变量类型一致。
为啥要学指针?不用不行吗?
可能有人会问,直接用变量挺方便的,为啥非要用指针呢?这就像问 “有门牌号为啥还要记门牌号?直接找房间不行吗?”
在处理数组的时候,指针特别方便。数组名本身就是数组第一个元素的地址,用指针 ++ 就能依次访问每个元素,比用下标 a [i] 有时候更灵活。还有函数传参,如果想在函数里修改外面变量的值,不用指针就做不到,这时候指针就派上大用场了。
兔子哥觉得,学指针最好的办法就是多写代码,少看理论。先从简单的例子开始,比如用指针修改变量的值,再试试用指针访问数组,一步步来。刚开始可能觉得绕,但写个三五遍之后,突然就会有种 “哦,原来这么回事” 的感觉。别害怕犯错,指针的错误信息虽然吓人,但多改几次就知道咋回事了。其实啊,指针就像个纸老虎,看着难,捅破了那层窗户纸,也就那样。希望这些能帮到你,慢慢学,肯定能学会!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~