1. 指针的本质与内存操作
指针是C/C++语言中最强大也最危险的工具之一。它本质上是一个存储内存地址的变量,就像现实世界中的门牌号码,告诉你数据具体存放在计算机内存的哪个位置。理解指针的关键在于掌握"地址"和"解引用"这两个核心概念。
当我们声明一个普通变量时,比如int num = 42;,计算机会在内存中分配一块空间存储这个整数值。而指针变量存储的不是值本身,而是这个值所在的内存地址。在32位系统中,指针通常占用4字节,64位系统中则是8字节,这与系统的寻址能力直接相关。
1.1 指针的基本操作语法
声明指针时需要在变量名前加星号,例如int *ptr;表示声明一个指向整型的指针。获取变量地址使用取地址运算符&,而通过指针访问实际值则需要解引用运算符*:
c复制int num = 42;
int *ptr = # // ptr现在存储了num的地址
printf("%d", *ptr); // 输出42,*ptr表示访问ptr指向的值
指针的算术运算有其特殊规则。对指针加1并不是简单地将地址值加1,而是根据指向类型的大小进行调整。例如,在int *ptr的情况下,ptr+1实际上会将地址增加sizeof(int)(通常是4字节),这使指针可以正确地遍历数组。
1.2 指针与数组的密切关系
数组名在大多数情况下会自动退化为指向数组首元素的指针。这也是为什么我们可以用指针来遍历数组:
c复制int arr[5] = {1,2,3,4,5};
int *ptr = arr; // 等价于 &arr[0]
for(int i=0; i<5; i++) {
printf("%d ", *(ptr + i));
}
这种等价性也解释了为什么数组下标访问arr[i]可以写成*(arr+i)的形式。但要注意数组名不是真正的指针变量——它没有自己的存储空间,不能被重新赋值。
重要提示:指针算术必须确保在合法内存范围内操作,越界访问会导致未定义行为,可能引发程序崩溃或安全漏洞。
2. 指针的高级应用场景
2.1 函数指针与回调机制
函数指针是指向函数而非数据的指针,它存储的是函数代码的入口地址。声明函数指针时需要指定返回类型和参数列表
