取地址()与解引用(*)——C语言的操作符的用法

📅 2026/7/2 12:06:35
取地址()与解引用(*)——C语言的操作符的用法
1. 两个符号本质区分1.1 取地址运算符单目作用获取变量在内存中的地址结果是一个指针值。语法变量名1.2 * 解引用运算符单目作用根据指针保存的地址访问该地址里存储的真实数据。语法*指针变量注意* 有两种身份不要混淆•定义指针变量时int *p; 这里 * 只是标识 p 是指针不是解引用运算•运算表达式中*p 这里 * 是解引用操作2. 基础示例分步理解#include stdio.h int main() { int a 10; // 普通整型变量存数值10 int *p; // p是int型指针专门存int变量的地址 // 1. a取出变量a的内存地址赋值给指针p p a; printf(a的值%d\n, a); printf(a的地址a%p\n, a); printf(指针p存储的值就是a的地址%p\n, p); printf(*p 解引用取p地址里的数据 %d\n, *p); // 2. 通过*p修改原变量a的值 *p 20; printf(修改后a %d, a); // a变成20 return 0; }运行逻辑拆解① a→ 拿到 a 的地址如0xffff0004② p a→ 指针 p 存下这个地址③ *p→ 顺着 p 存的地址找到内存里 a 的值3. 和 * 互为逆运算对同一个变量*(a)等价于aint a 5; // a 取地址 → *再解引用还原原值 printf(%d, *(a)); // 输出5同理(*p)等价于pint a5; int *pa; // *p是a的值取地址又变回a的地址等于p printf(%p, (*p)); printf(%p, p);4. 常见场景用法4.1 函数传参修改外部变量不用返回值普通传参是值拷贝函数内改不了外面变量传地址 函数内解引用*可修改实参void change(int *x) { *x 100; // 解引用修改主函数a的值 } int main() { int a 10; change(a); // a取地址传给指针形参 printf(%d, a); // 输出100 return 0; }4.2 二级指针int **pp* 和 叠加int a 10; int *p a; // p存a的地址 int **pp p; // pp存指针p的地址二级指针 // 层层解引用 printf(%d, **pp); // 等价*(*pp) → *p → a关系a→ p 的值p→ pp 的值*pp→ p**pp→ a5. 易混淆易错点5.1 定义指针时的 * 不是解引用int* p; // *仅修饰p是指针无运算作用 p a; // 运算时取地址赋值5.2 不能对常量 / 表达式取地址int a; 5; // 错误字面量无内存地址 (a1);// 错误表达式临时值无地址5.3 野指针解引用*会崩溃指针没有存有效地址时不能用*int *p; *p 10; // 崩溃p是随机垃圾地址5.4只能作用于内存实体变量、数组元素数组名本身是地址不用再加 int arr[5]; int *p arr; // 正确arr等价arr[0] int *p arr; // 类型不匹配数组地址 vs int指针6. 总结① 变量向外拿地址从数据拿到它的门牌号② *指针向内找数据拿着门牌号进门取里面的值③ 二者叠加*(x)还原原始变量互为反向操作。