指针
从裸指针到函数指针,把所有边界、陷阱与反直觉细节一次画清
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
指针
从裸指针到函数指针,把所有边界、陷阱与反直觉细节一次画清
认识指针
我们已经知道变量是数据的容器,但每个数据都住在一段内存里,内存有门牌号。指针,就是把门牌号记下来的小本子。
房卡记房号、房号对应房间;指针记地址、地址对应数据。房号本身不是房间。
指针运算
你已经知道指针存的是地址——一个数字。但指针不是普通整数:你不能把两个指针相乘,也不能拿指针除以 2。C/C 标准为指针定义了一套专属的算术规则,正是这套规则让指针遍历数组成为可能。
翻过一页就是一整页内容,不会逐字跳;指针 ±1 就是跳过一个完整元素
指针与数组
指针能 ++、能相减,这套算术只有在连续内存上才有意义——而数组正是一段连续内存。这一页揭指针和数组之间那条剪不断的等价关系。
墙上房号固定不可擦(数组名值不变),便签可改写(指针可重新赋值),但都能定位同一排房间中的某一间
指针与字符串
前页看到数组名就是首元素指针。字符串本质就是字符数组,但'字面量'与'字符数组'这两条路在指针层面差别很大——一个是借,一个是买。
借的书只能看不能涂;买的本子随便改——对应:字面量只读、数组可写
指针数组
上页我们知道字符串本质是 char *。要存多条字符串,每条都是一个指针——怎么组织?把它们放进一个数组,这个数组就叫指针数组。
卡片排成一列(数组连续),每张写一个书架位置(指针),书本身可散落各处
二级C考点解析之指针基本
前页已看到,指针能带着地址参与运算和比较。但运算的前提,是先分清对象、地址与指针;否则结果即使算对,也可能解引用到错误对象。
导航保存门牌号像指针保存地址;按门牌找房像 `*p` 找目标,房号加实体信息才对应 T
二级C考点解析之指针与字
前面讲了指针和数组,但考试最爱挖坑的地方在「指针和字符串」——这块的陷阱最隐蔽,改一个字符就可能让程序崩溃。
合同只能传阅不能涂改;字符串常量在只读区,改了就崩
本节要点
- ✓指针本质即地址,`*`取值、`&`取地址是两层操作
- ✓指针+1 跨过的是一个类型宽度,而非一个字节
- ✓数组名退化为常量指针,不能自增也不能赋值
- ✓字符串字面量在只读区,char*形式不可改写
- ✓二级指针保存的是指针变量的地址,写作 T**
课后思考
先独立想一会儿再看参考答案,检验自己真懂了几分。
参考答案指针存的是另一个变量的内存地址。64 位系统上地址是 64 位二进制,普通 int 通常只有 32 位会截断;且不同类型指针步长不同,不能直接互通。
参考答案结果表示两指针之间相隔的元素个数,不是字节差。前置条件是两指针必须指向同一数组,否则结果未定义,所以脱离数组的指针减法没有意义。
参考答案字面量放在只读数据区,多个相同内容可能共享同一地址,内容不可写;字符数组放在栈或全局区,独占一块可写内存。两者指针都能用,但语义完全不同。