精通C语言指针:专家级实战教程
精通C语言指针
深入探索C语言指针的核心概念,从内存地址到实战示例及常见陷阱,助力开发者通过真实代码加深理解。
指针是高效C语言编程的基石。在深入指针之前,让我们先回顾C语言中内存地址的工作原理。
C语言中的内存地址
对于变量 var,表达式 &var 可获得 var 存储的内存地址。
地址操作常见于 scanf() 中:
scanf("%d", &var);
这将用户输入直接存入 var 的内存位置。快速演示:
#include <stdio.h>
int main() {
int var = 5;
printf("var: %d\n", var);
printf("address of var: %p", &var);
return 0;
}
输出
var: 5 address of var: 0x7fffc1a2b1c8
注意: 地址每次运行和系统都不同。
什么是指针?
指针是一个存储内存地址而非常规值的变量。通过存储地址,指针实现对数据的间接访问,从而支持动态内存管理、高效数据结构和底层系统控制。
声明指针
典型声明语法:
int *p;
常见变体:
int *p1; int *p2;
星号周围的空格不影响声明。但要注意逗号分隔的声明:
int *p1, p2; /* p1 是指针,p2 是 int */
给指针赋地址
示例:
int *pc, c;
c = 5;
pc = &c;
这里 c 获得值 5,pc 存储 c 的地址。
解引用指针
使用解引用运算符 * 访问指针指向地址处的值:
int *pc, c;
c = 5;
pc = &c;
printf("%d", *pc); /* 打印 5 */
记住,pc 是指针;*pc 获取其指向的值。尝试将地址赋给 *pc(如 *pc = &c;)是无效的。
* 运算符称为解引用运算符。
通过指针修改值
可以通过指针改变底层数据:
int *pc, c;
c = 5;
pc = &c;
*pc = 1; /* c 变为 1 */
printf("%d", c); /* 打印 1 */
重新赋值后,多个变量可共享同一指针:
int *pc, c, d;
c = 5;
d = -15;
pc = &c;
printf("%d", *pc); /* 5 */
pc = &d;
printf("%d", *pc); /* -15 */
实战示例
运行完整程序观察指针值保持不变而其引用的数据可变:
#include <stdio.h>
int main() {
int *pc, c;
c = 22;
printf("Address of c: %p\n", &c);
printf("Value of c: %d\n\n", c);
pc = &c;
printf("Address of pointer pc: %p\n", pc);
printf("Content of pointer pc: %d\n\n", *pc);
c = 11;
printf("Address of pointer pc: %p\n", pc);
printf("Content of pointer pc: %d\n\n", *pc);
*pc = 2;
printf("Address of c: %p\n", &c);
printf("Value of c: %d\n\n", c);
return 0;
}
输出
Address of c: 0x7fffc1a2b1c8 Value of c: 22 Address of pointer pc: 0x7fffc1a2b1c8 Content of pointer pc: 22 Address of pointer pc: 0x7fffc1a2b1c8 Content of pointer pc: 11 Address of c: 0x7fffc1a2b1c8 Value of c: 2
解析
int *pc, c;– 声明指针 pc 和 int c。c = 22;– 在 c 的内存存储 22。pc = &c;– 让 pc 指向 c。c = 11;– 通过直接访问更新值。*pc = 2;– 通过指针改变值。
指针常见错误
典型错误包括混淆指针和值:
int c, *pc; // 错误 – 将值赋给指针
pc = c; // Error
// 错误 – 试图将地址赋给解引用指针
*pc = &c; // Error
// 正确 – 将地址赋给指针
pc = &c; // OK
// 正确 – 将值赋给指针指向的位置
*pc = c; // OK
对初学者,int *p = &c; 可能令人困惑。它等价于:
int *p;
p = &c;
写成 int* p = &c; 可减少歧义。
理解指针后,你将准备好探索指针与数组的关系(见下一教程)。
C语言