【C语言】*与深层理解
在 C 语言中,指针(*
)和取地址符(&
)是两个核心概念,用于实现变量地址的传递和间接访问。理解它们对掌握 C 语言的内存操作至关重要。
1. 指针符号(*
)的双重含义
① 声明指针变量
在变量声明时,*
表示 “这是一个指针变量”。指针变量存储的是内存地址,而非实际数据。
int a = 10; // 普通整型变量
int *p; // 声明一个指向int类型的指针
② 解引用(Dereference)操作
在表达式中,*
表示 “访问指针指向的内存地址中的值”。
p = &a; // p存储a的地址
printf("%d", *p); // 输出:10(通过p访问a的值)
*p = 20; // 修改p指向的内存中的值,即a=20
2. 取地址符(&
)
&
是一元运算符,用于获取变量的内存地址。
int a = 10;
int *p = &a; // p存储a的地址
printf("%p", p); // 输出a的内存地址(如:0x7ffeefbff5fc)
3. 结合使用:函数参数传递
① 值传递(普通变量)
函数接收的是变量的副本,无法修改原始变量。
void func(int x) {x = 100; // 只修改副本,不影响main中的a
}int main() {int a = 10;func(a); // 传递a的值printf("%d", a); // 输出:10(未改变)
}
② 引用传递(指针变量)
函数接收变量的地址,可以直接修改原始变量。
void func(int *p) {*p = 100; // 通过指针修改原始变量
}int main() {int a = 10;func(&a); // 传递a的地址printf("%d", a); // 输出:100(已改变)
}
4. 实现交换的代码应用
在排序代码中,swap
函数通过指针和取地址符实现变量交换:
void swap(int *a, int *b) {if (*a > *b) {int temp = *a; // 保存a指向的值*a = *b; // 将b指向的值赋给a指向的内存*b = temp; // 将temp赋给b指向的内存}
}int main() {int x = 20, y = 15;swap(&x, &y); // 传递x和y的地址// 此时x=15, y=20
}
&x
和&y
获取变量的地址。int *a
和int *b
声明指针参数。*a
和*b
访问并修改原始变量。
5. 常见误区
-
混淆指针声明和赋值:
int a = 10; int *p = a; // 错误!p需要存储地址,而非值 int *p = &a; // 正确
-
忘记解引用:
void func(int *p) {p = 100; // 错误!修改了指针p本身,而非p指向的值*p = 100; // 正确 }
总结
*
:声明指针变量(类型后)或解引用操作(表达式中)。&
:获取变量的内存地址。- 指针传递:让函数能够修改调用者的变量,是 C 语言实现 “返回多个值” 的常用方式。