今天我们来聊聊C语言里那个让无数新手闻风丧胆、老手也偶尔翻车的一个大魔王——指针。
初次接触"指针"这个概念时,我误以为要像外科医生那样,手持手术刀(指针)去操作病人的心脏(内存)。后来才明白,指针其实更像是个勤勤恳恳的外卖小哥。
不信?咱们边吃外卖边聊。
一、内存是个啥?——把你家小区想象成内存
内存就是电脑干活时的临时桌子。你定义的变量(比如int a = 10),都得往这张桌子上放。
但桌子那么大,东西放哪了?这就涉及到地址了。
还记得你点外卖的时候填的地址吗?几号楼、几单元、几零几。计算机也是这么干的,它给内存里的每一个字节都编了个号,这个号就是地址。
你的变量
a住在 6号楼666室,指针就是那个拿着地址去找你的外卖小哥。
二、指针变量:专门存地址的“通讯录”
既然有地址,我们就得有个地方存这个地址。这就是指针变量。
1. 怎么拿到地址?(取地址符 &)
&读作 "address of",就是“谁谁谁的地址”。

2. 怎么定义指针?(那个神秘的星号 *)
定义指针的格式是:类型* 指针名。

这里的 int*是在说:“嘿,我这个指针专门存 int类型变量的地址。”
3. 指针怎么用?(解引用 *)
指针拿到了地址,怎么看里面的值?用 *(解引用)。

这行代码的意思是:顺着指针p存的地址,去那个房间里把东西拿出来。
4. 指针不仅能看,还能改!
既然能进房间,那当然能换家具啊。

这就好比外卖小哥不仅找到了你家,还顺手把你桌上的苹果换成了榴莲(虽然有点过分,但他确实做到了)。
三、指针大小:不管啥类型,钱包都一样大
这是个高频面试题:指针占几个字节?
很多人以为是 char*占1个字节,int*占4个字节。
错!大错特错!
指针的大小取决于你是住在多大的小区(系统位数),跟房子里住的是谁(数据类型)没关系。
|
系统环境 |
地址总线宽度 |
指针大小 |
|---|---|---|
|
32位系统 |
32根线 |
4个字节 |
|
64位系统 |
64根线 |
8个字节 |
你可以这么理解:
不管是宝马的车牌,还是夏利的车牌,在同一个城市(同一个系统)里,车牌的长度(指针大小)都是一样的!

看,它们就是都是一样大吧!
四、指针类型:决定了“咬一口”吃多大口
既然大小都一样,那还要区分 int*和 char*干嘛?
因为类型决定了指针的“访问权限”!
-
char*:一次只看1个字节(只可以一口一个小汉堡的喔)。 -
int*:一次看4个字节(能够一口吞下巨无霸的汉堡)。
不同类型的指针加减运算之所以步长不同,正是由其指向的数据类型决定的。例如,int指针+1会移动4个字节(一个int的大小),而char指针+1仅移动1个字节(一个char的大小),这正是因为不同数据类型的存储大小存在差异!
五、指针运算:在内存里“跳房子”
1. 指针 + 整数(遍历数组的神器)
数组在内存里是连续住的,就像一排连号的宿舍。

这比写 arr[i]帅多了,对吧,还能给人一种更高级感,你的格式和使用方法比别人高出一截。
2. 指针 - 指针(算距离)
两个指针相减,得到的不是地址差,而是中间隔了多少个元素。

这就是像在问:“3号楼和1号楼之间隔了几栋楼?” 答案自然就是2栋,这么一类比,是不是也挺容易理解的呢。
3. 指针的关系运算(比大小)
指针也可以比谁在前谁在后。

这是遍历数组的另一种骚操作。
六、总结时间到啦!!!

现在再看指针,是不是觉得它就是一个带着地址到处跑的外卖小哥?
别怕它,下次见到 int* p,就在心里默念:“哦,这不就是个送餐员嘛!” 心态一放松,代码就通了。
赶紧去敲两行代码试试,比如用指针遍历一个数组,或者试着修改一下变量的值。
有什么问题或者想要探讨的,欢迎在评论区留言,也欢迎大家指出问题并且提出意见,希望可以和大家一起进步学习。


532

被折叠的 条评论
为什么被折叠?



