引言
指针与数据结构是底层开发的基石。指针直接操作内存,赋予程序灵活性;数据结构则组织数据,提供高效解决方案。两者紧密相连,指针在链表、树和图的实现中扮演关键角色。深入理解它们,不仅是编写高效代码的基础,更是掌握操作系统、数据库等底层技术的关键。
本文将剖析指针基础、数据结构分类及具体应用,涵盖常见问题与优化策略,帮助构建完整的知识体系。
指针基础
指针的定义与本质
在 C 语言中,指针是一种存储内存地址的变量。它不像普通变量那样直接存值,而是像一把钥匙,指向存放实际数据的位置。通过指针,我们可以直接操作内存,大幅提升处理效率。
定义整型指针通常写作 int *p;。这里的 int 指明指向的数据类型,* 声明 p 为指针变量。此时 p 只是一个空的'箭头',只有赋予有效地址后才真正指向目标。例如:
int num = 10;
int *p = #
这里 &num 获取了 num 的地址赋给 p,之后通过 *p 即可间接访问和操作 num 的值。
取地址与取值操作符
& 用于获取变量地址,*(解引用)则根据地址取出对应内存中的数据。这两个操作符优先级较高,结合方向从右至左。比如 *&a,先取 a 的地址再解引用,结果仍是 a 本身。理解这些规则对编写复杂表达式至关重要。
指针的使用场景
函数参数传递
指针能实现对原始变量的修改,这是值传递做不到的。比如交换两个整数,若用值传递,函数内的修改不会影响外部变量。使用指针传递地址,函数内通过解引用直接修改原数据即可。
#include <stdio.h>
void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main() {
int num1 = 5, num2 = 10;
swap(&num1, &num2);
printf("num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
指针偏移
指针加减运算允许其指向相邻内存位置,常用于遍历数组或访问结构体成员。偏移步长取决于数据类型大小。例如 int 指针加 1 通常偏移 4 字节,而 char 指针加 1 仅偏移 1 字节。
#include <stdio.h>
int {
arr[] = {, , , , };
*p = arr;
( i = ; i < ; i++) {
(, *(p + i));
}
;
}


