第八章——地址和指针 第三节——通过指针来引用一个存储单元
*:间接访问运算符(间址运算符)
首先看如下示例代码:
1 | int *p , i = 10 , j; |
说明
*的运算对象必须是地址或者是存放地址的指针变量。*的含义是取地址中的内容
示例二
1 | int *p,k=0; |
说明
- 出现在赋值号左边时,代表的是指针所指的存储单元;当出现在赋值号右边时,代表的是所指存储单元的内容。
- *p=*p+1的含义是指将p所指向单元的内容加1,然后再放入p所指向的单元中。即将k的值加1,此时,k=101。
&与*运算符
含义
&
- 含义:取变量的地址
- 单目运算符
- 优先级:与*相同
- 结合性:自右向左
*
- 含义:取指针所指向变量的内容
- 单目运算符
- 优先级:与&相同
- 结合性:自右向左
两者关系:
互为逆运算
个人理解
在C语言里,*和&这两个符号看起来像乘法和按位与,但它们其实是“指针操作的双胞胎兄弟”,一个负责“找地址”,一个负责“用地址找东西”。我们用“人话”来解释它们到底在干嘛。
1. 首先,变量和内存地址是什么关系?
想象你有一个装苹果的盒子,盒子的名字叫a,里面放了5个苹果。
1 | int a = 5; |
a是盒子的名字。5是盒子里的苹果数量。- 这个盒子放在某个地方(比如厨房的桌子上),这个“位置”就是它的内存地址。
2. &:取地址运算符(“我要盒子的位置!”)
& 就是说:“嘿,告诉我这个盒子放在哪?”
1 | int *p = &a; |
&a:就是问“盒子 a 放在哪?”——得到的是它的地址(比如厨房桌子的第3排第5列)。int *p:是一个“存折”,存折上写着“我指向一个 int 类型的盒子”。p = &a:把地址(厨房的位置)写在存折上。
3. *:解引用运算符(“我要用地址找盒子!”)
* 有两种用法,分别对应两种场景:
(1) 声明指针(开个存折)
1 | int *p; |
- 这里的
*是告诉编译器:“我要开个存折,以后用来存 int 类型盒子的地址。”
(2) 解引用指针(根据地址取东西)
1 | *p = 10; |
- 这里的
*p是说:“根据存折上的地址(厨房的位置),找到那个盒子,然后往里面放10个苹果。”
4. 对比总结:& 和 * 是“互为反义词”
| 操作 | 人话解释 | 示例 |
|---|---|---|
&a |
找到变量 a 的地址 | 把 a 的地址(厨房位置)写在存折上 |
*p |
根据指针 p 的地址,找到它指向的值 | 根据存折上的地址,去拿盒子的苹果 |
5. 生活化例子:快递送苹果
- 变量 a:你家的快递柜,编号是 123,里面有 5 个苹果。
&a:快递员问你“你的快递柜编号是多少?”,你回答“123”。- 指针 p:快递员的小本本,他记下“123”这个编号。
*p:快递员根据小本本上的编号 123,去快递柜取出苹果。
6. 常见错误:别让存折“没写地址”或“写错地址”
错误1:未初始化指针就用
*p1
2int *p;
*p = 10; // 错误!存折上没写地址,凭空改值会出事!👉 比喻:存折上没写快递柜编号,快递员随便找个地方放苹果,可能砸了别人的快递!
错误2:对非指针变量用
*1
2int a = 5;
int b = *a; // 错误!a 不是指针,不能解引用👉 比喻:a 是个快递柜编号,不是存折,你不能用它去找“编号的编号”。
7. 代码示例:一步一步看懂
1 |
|
8. 最后总结:一句话记住它们
&:从变量找地址(快递柜 → 快递柜编号)。*:从地址找变量(快递柜编号 → 快递柜里的苹果)。
它们就像“钥匙和锁”、“地图和宝藏”的关系:
&是钥匙(找到地址),*是地图(根据地址找到值)。
考点
- 指针运算符“*”:其作用是返回以操作对象的值作为地址的变量的内容。
- 指针运算符“*”是单目运算符,优先级高于所有的双目运算符,结合性是自右向左。
- 标题: 第八章——地址和指针 第三节——通过指针来引用一个存储单元
- 作者: 亓翎_Re-Tikara
- 创建于 : 2026-02-07 02:21:28
- 更新于 : 2026-02-10 02:48:46
- 链接: https://re-tikara.fun/Blog/posts/5d0f6387/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
