1. 指针的本质:从内存寻址说起
指针在C语言中之所以被称为"灵魂",是因为它直接操作内存地址的特性。想象一下城市中的快递柜——每个柜子都有唯一的编号(地址),里面存放着包裹(数据)。指针就是这个编号的记录本,它不直接存储包裹内容,而是告诉你该去哪个柜子取件。
1.1 指针变量的内存模型
在32位系统中,指针变量固定占4字节(64位系统为8字节),这与它指向的数据类型无关。例如:
c复制int *p; // 指向整型的指针
double *pd; // 指向双精度浮点的指针
这两个指针变量本身占用的内存空间相同,区别在于它们告诉编译器:"当我被解引用时,应该从目标地址开始读取多少字节的数据"。
关键理解:指针类型决定了指针算术运算的步长。p+1移动sizeof(int)字节,pd+1移动sizeof(double)字节
1.2 取地址与解引用操作
&和*是理解指针最基础的两个运算符:
c复制int val = 42;
int *ptr = &val; // &获取val的内存地址
printf("%d", *ptr); // *解引用获取地址存储的值
常见误区澄清:
*在声明时表示指针类型,在表达式中表示解引用操作- 野指针问题:指针变量未经初始化时,其值是随机的内存地址
1.3 指针的二进制表示
在机器层面,指针就是一个存储内存地址的整数值。通过这个小实验可以直观理解:
c复制int main() {
int x = 0x12345678;
unsigned char *p = (unsigned char*)&x;
for(int i=0; i<sizeof(x); i++)
printf("%02x ", p[i]); // 输出字节序
return 0;
}
这个程序会显示系统的大小端存储方式,揭示指针底层的内存访问机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针与const的四种组合
const修饰指针时,根据位置不同会产生完全不同的语义约束,这是面试中最常考察的难点之一。
2.1 常量指针 vs 指针常量
通过一个对比表格理解:
| 类型 | 声明示例 | 可修改指针指向 | 可修改指向的
