
*
是一个非常核心的符号,它有两个完全不同的用途,根据上下文会有不同的含义。我们来系统地讲清楚。两大作用:
作用类型 | 使用场景 | 示例 | 含义 |
---|---|---|---|
解引用(dereference) | 访问指针指向的数据 | *p = 10; | 访问或修改指针 p 指向的值 |
声明指针 | 定义变量是一个指针类型 | int *p; | p 是一个 int 类型的指针 |
一、声明指针(声明这是一个指针变量)
int *p;
这行代码的意思是:“声明一个变量 p,它是一个指向 int 类型的指针。”
注意:
跟变量名
p
结合,说明p
是一个“指针”;int *p, q;
中只有p
是指针,q
不是!
建议写法:加小括号强调清晰:
int* p; // OK,但容易误导
int *p, *q; // 更清晰,两个都是指针
二、解引用(访问指针指向的值)
int x = 100;
int *p = &x;
printf("%d\\n", *p); // 输出 100
这行 *p
的意思是:“取出 p 指针指向的地址里的值。”
也可以修改这个值:
*p = 200; // x 现在变成了 200
所以 *p
= “我指向哪里,就操作哪里的数据”。
举个完整例子
int main() {
int x = 10;
int *p = &x; // p 指向 x 的地址
printf("x = %d\\n", x); // 输出 10
printf("*p = %d\\n", *p); // 输出 10
*p = 20; // 修改指针所指地址的值
printf("x after *p = 20: %d\\n", x); // 输出 20
return 0;
}
和 &
的配合记忆
操作符 | 含义 | 作用方向 |
---|---|---|
& | 取地址 | 值 ➡ 地址 |
* | 解引用 | 地址 ➡ 值 |
记住:
&x
= “我要x
的地址”p
= “我要p
指向的值”
高级一点:函数指针中也有
int add(int a, int b) { return a + b; }
int (*fp)(int, int) = add;
printf("%d\\n", (*fp)(3, 4)); // 调用函数指针,结果是 7
这个 (*fp)
是必须加括号的,因为 *fp(int, int)
会被理解成函数返回一个指针,不是函数指针。
小结
写法 | 说明 |
---|---|
int *p; | 声明一个指向 int 的指针 |
*p = 10; | 给 p 指向的内存地址赋值 |
int *p = &x; | 指针指向变量 x 的地址 |
*p | 解引用:访问指针指向的数据 |
(*fp)(a, b) | 通过函数指针调用函数 |