学C语言时,很多人第一次看到 int *p; 这行代码就懵了:星号在哪儿?p到底存的是啥?别急,咱们不讲术语堆砌,就拿你每天用的快递来打个比方。
指针不是“值”,是“地址”
想象你租了个小仓库,编号是103。你自己不往里塞货,只负责记住这个编号。别人问:“东西放哪儿了?”你说:“103号仓。”——这个“103”,就是地址。指针变量干的就是这事:它不存具体数据(比如数字7、字符'a'),而是存另一个变量在内存里的位置编号。
怎么定义一个指针变量?
语法很简单:
数据类型 *指针名;比如:int *p; // p 是一个指向 int 类型变量的指针
char *name; // name 是一个指向 char 类型变量的指针
float *price; // price 是一个指向 float 类型变量的指针注意星号 * 是定义的一部分,写在类型和名字之间,表示“这是个指针”。它跟后面乘法的星号不是一回事。
一个小实验,马上看懂
下面这段代码,你可以在电脑上跑一跑:
#include <stdio.h>
int main() {
int age = 25;
int *p = &age; // & 是取地址符,意思是“把 age 的门牌号给 p”
printf("age 的值是:%d\n", age); // 输出 25
printf("age 的地址是:%p\n", &age); // 输出类似 0x7ffc1234abcd
printf("p 存的地址是:%p\n", p); // 和上一行输出一样
printf("p 指向的值是:%d\n", *p); // *p 是“解引用”,意思是“去 p 记的地址里取值”
return 0;
}运行后你会发现:p 里装的,正是 age 在内存里的“门牌号”;而 *p 就是通过这个门牌号,把 age 的值又找回来了。
常见误区提醒
• int* p, q; 这句里,只有 p 是指针,q 是普通 int 变量(星号不作用于 q);想两个都是指针,得写成 int *p, *q;
• 定义指针时没初始化(比如只写 int *p;),p 里面是随机垃圾地址,千万别直接 *p = 10;,程序很可能崩溃——就像按了个乱写的门牌号去敲门,谁也不知道会打开什么。
指针变量的定义,核心就三点:带星号、有类型、存地址。先记牢这句口诀:“指针是地址的容器,不是数据的容器。”之后再学传参、动态内存,就顺多了。