1. 指针的本质:内存操作的利器
指针是C语言区别于其他高级语言的标志性特性。理解指针的本质,需要从计算机底层的内存模型说起。在32位系统中,每个内存单元都有一个4字节的地址编号;64位系统则使用8字节地址。指针变量就是存储这些内存地址的特殊变量。
关键理解:指针变量本身也占用内存空间(64位系统固定8字节),它存储的值是另一个内存单元的地址。
指针的强大之处在于它提供了直接操作内存的能力。通过指针,我们可以:
- 高效传递大数据(只需传递指针而非拷贝整个数据)
- 动态管理内存(malloc/free)
- 实现复杂数据结构(链表、树等)
- 回调函数机制(函数指针)
c复制int a = 10;
int *p = &a; // p存储了a的地址
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针基础操作全解析
2.1 地址运算符(&)与解引用运算符(*)
&运算符获取变量的内存地址,*运算符则通过指针访问目标内存。这两个运算符形成互补关系:
c复制int b = 20;
int *q = &b; // &取地址
printf("%d", *q); // *解引用
特别要注意的是指针的类型决定了如何解释目标内存。例如:
- char* 每次访问1字节
- int* 每次访问4字节(通常)
- double* 每次访问8字节
2.2 指针的算术运算
指针运算以指向的数据类型大小为步长:
c复制int arr[3] = {10,20,30};
int *p = arr;
p++; // 移动sizeof(int)字节,指向arr[1]
指针运算的典型应用:
- 数组遍历
- 内存块操作
- 字符串处理
3. 指针与函数:参数传递的艺术
3.1 值传递 vs 地址传递
C语言默认采用值传递,要修改实参必须传递指针:
c复制void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
3.2 数组参数传递的真相
数组作为参数传递时,实际传递的是数组首元素地址。以下三种声明完全等价:
c复制void func(int arr[10]);
void func(int arr[])
