1. 指针的本质:从门牌号说起
第一次接触C语言指针时,导师用了个生活化的比喻:"指针就像门牌号,变量就是住在房子里的人"。这个比方让我瞬间理解了指针的核心概念——它不直接存储数据,而是保存数据的地址。就像你去朋友家做客,不需要把整栋房子搬走,只需要知道门牌号就能找到人。
在计算机内存中,每个变量都占据一块空间,就像城市里的每栋房子都有唯一地址。指针变量特殊之处在于,它存储的不是"住户"(数据本身),而是"门牌号"(内存地址)。例如:
c复制int resident = 42; // 房子里住着42这个整数
int *address = &resident; // address变量记录的是resident的门牌号
这里&运算符就是"取地址"操作,相当于问变量:"你家门牌号是多少?"。而*运算符是"解引用",相当于"按这个门牌号去敲门"。
关键理解:指针本身也是个变量,它也需要占用内存空间(通常4或8字节)。指针变量里存的是地址值,就像记事本上写着的门牌号码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针基础操作全解析
2.1 声明与初始化
指针声明需要明确它指向的数据类型,就像门牌号需要说明是哪个小区的:
c复制int *int_ptr; // 指向整型的指针
char *char_ptr; // 指向字符的指针
float *float_ptr; // 指向浮点数的指针
未初始化的指针就像随意写的门牌号,可能指向危险区域。好的习惯是:
c复制int *ptr = NULL; // 初始化为空指针,相当于"暂未分配门牌号"
if (ptr != NULL) {
*ptr = 10; // 安全操作检查
}
2.2 指针的算术运算
指针加减不同于普通数值运算,它基于指向类型的大小自动调整:
c复制int arr[3] = {10, 20, 30};
int *ptr = arr; // 指向数组首元素
printf("%d\n", *ptr); // 输出10
ptr++; // 移动到下一个int位置
printf("%d\n", *ptr); // 输出20
这里ptr++不是简单
