指针是C语言区别于其他高级语言的核心特性之一。很多初学者第一次接触指针时会产生困惑——这个"指向地址的变量"到底有什么用?我当年学习时也花了整整两周才真正理解指针的本质。
简单来说,指针就是存储内存地址的变量。但这句话背后隐藏着几个关键点:
举个例子,假设我们有一个整型变量:
c复制int num = 42;
在32位系统中,这个变量会占用4字节内存空间。假设系统为它分配的内存地址是0x7ffd3312,那么指针变量存储的就是这个0x7ffd3312地址值。
注意:指针的大小与系统架构有关。32位系统指针通常4字节,64位系统8字节。可以用sizeof(void*)查看。
指针变量的声明遵循特定语法规则:
c复制数据类型 *指针变量名;
这里的星号()是指针声明符。常见错误是混淆声明时的和使用时的*:
c复制int *p; // 声明一个整型指针
*p = 10; // 使用指针访问内存
未初始化的指针是危险的"野指针",可能指向任意内存地址。好的实践是:
c复制int *p = NULL; // 安全初始化
if(p != NULL) {
*p = 10;
}
&运算符获取变量地址,*运算符解引用指针:
c复制int var = 20;
int *ptr = &var; // ptr现在存储var的地址
printf("%d", *ptr); // 输出20,通过指针访问var的值
指针运算以所指向类型的大小为单位:
c复制int arr[3] = {10,20,30};
int *p = arr;
p++; // 移动sizeof(int)个字节,指向arr[1]
重要区别:指针加减是移动若干个数据单位,而不是简单的数值加减。这在数组遍历时特别有用。
数组名在大多数情况下会退化为指向数组首元素的指针:
c复制int arr[5] = {1,2,3,4,5};
// 以下两种写法等价
printf("%d", arr[2]);
printf("%d", *(arr+2));
这是指针的典型应用场景:
c复制int nums[5] = {1,2,3,4,5};
for(int *p = nums; p < nums+5; p++) {
printf("%d ", *p);
}
比传统数组索引访问更高效,特别是在嵌入式系统等资源受限环境中。
指向指针的指针称为多级指针,常见的是二级指针:
c复制int val = 100;
int *p = &val;
int **pp = &p; // 二级指针
printf("%d", **pp); // 输出100
c复制void allocate(int **ptr) {
*ptr = malloc(10 * sizeof(int));
}
c复制#ifdef DEBUG
printf("指针地址: %p, 指向的值: %d\n", ptr, *ptr);
#endif
C语言中字符串本质是字符数组,常用指针操作:
c复制char str[] = "Hello";
char *p = str;
while(*p) { // 直到遇到'\0'
putchar(*p++);
}
以strlen为例,展示指针的高效实现:
c复制size_t strlen(const char *s) {
const char *p = s;
while(*p) p++;
return p - s;
}
C语言默认是值传递,要修改实参需传递指针:
c复制void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
c复制// 错误示例
char *badFunc() {
char str[10] = "error";
return str; // 局部数组会在函数返回后失效
}
函数指针存储函数入口地址:
c复制int (*funcPtr)(int, int); // 声明
funcPtr = &max; // 指向max函数
int result = (*funcPtr)(3,5); // 调用
c复制// 回调函数示例
void process(int (*callback)(int)) {
int result = callback(10);
// ...
}
c复制void safeCopy(char *dst, const char *src, size_t size) {
if(dst && src && size > 0) {
strncpy(dst, src, size-1);
dst[size-1] = '\0';
}
}
指针是C语言的灵魂所在,掌握指针不仅是为了写C程序,更是理解计算机内存模型的重要途径。我在实际项目中最深的体会是:良好的指针使用习惯比炫技的指针技巧更重要。建议初学者从简单的例子开始,逐步构建正确的指针思维模型。