第八章——地址和指针 第三节——通过指针来引用一个存储单元

第八章——地址和指针 第三节——通过指针来引用一个存储单元

亓翎_Re-Tikara Lv5

*:间接访问运算符(间址运算符)

  首先看如下示例代码:

1
2
3
4
5
6
7
int *p , i = 10 , j;
p = &i;
j = *p;

// 等价于看j = *(&i)

// 语句整体等价于 j = i;

说明

  1. *的运算对象必须是地址或者是存放地址的指针变量。
  2. *的含义是取地址中的内容
    .png

示例二

1
2
3
4
5
6
7
8
int *p,k=0;
p=&k;
*p=100;
*p=*p+1;
// 最后一行代码等价于
// *p+=1
// ++*p 
// (*p)++

说明

  • 出现在赋值号左边时,代表的是指针所指的存储单元;当出现在赋值号右边时,代表的是所指存储单元的内容。
  • *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:未初始化指针就用 *p

    1
    2
    int *p;
    *p = 10; // 错误!存折上没写地址,凭空改值会出事!

    👉 比喻:存折上没写快递柜编号,快递员随便找个地方放苹果,可能砸了别人的快递!

  • 错误2:对非指针变量用 *

    1
    2
    int a = 5;
    int b = *a; // 错误!a 不是指针,不能解引用

    👉 比喻:a 是个快递柜编号,不是存折,你不能用它去找“编号的编号”。


7. 代码示例:一步一步看懂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main() {
int a = 5; // 有个快递柜 a,编号 123,里面有 5 个苹果
int *p = &a; // 存折 p 记下地址 123
printf("a 的值是 %d\n", a); // 输出 5
printf("a 的地址是 %p\n", &a); // 输出 123(实际是十六进制地址)
printf("p 里的地址是 %p\n", p); // 输出 123
printf("p 指向的值是 %d\n", *p); // 输出 5(根据地址 123 取苹果)

*p = 10; // 根据存折里的地址 123,把苹果改成 10 个
printf("现在 a 的值是 %d\n", a); // 输出 10
return 0;
}

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 进行许可。