C语言指针与内存管理详解,掌握指针操作与动态分配
本文面向C语言初学者,系统讲解指针与内存管理的基础与实战方法。内容涵盖指针概念、指针运算、数组与指针关系、函数指针、动态内存分配(malloc/calloc/realloc)、内存释放(free)、内存泄漏与安全问题。通过实例讲解和分步操作,帮助读者快速掌握C语言指针及内存管理技能,提高程序稳定性和性能。
正文教程
一、指针基础
指针定义与使用
#include <stdio.h>
int main() {
int a = 10;
int *p = &a; // p保存a的地址
printf("a = %d, 地址 = %p ", *p, p);
return 0;
}
技巧:
*p访问指针指向的值,&a取变量地址
空指针与NULL
int *p = NULL;
if (p == NULL) printf("指针为空 ");
二、指针运算与数组关系
指针运算
int arr[3] = {1,2,3};
int *p = arr;
printf("%d %d ", *p, *(p+1)); // 访问数组元素
技巧:数组名即首地址,可通过指针遍历数组
指针与函数参数
void increment(int *p) {
(*p)++;
}
int main() {
int a = 5;
increment(&a);
printf("%d ", a); // 输出6
}
技巧:通过指针实现函数修改外部变量
三、函数指针
#include <stdio.h>
void sayHello() { printf("Hello "); }
int main() {
void (*funcPtr)() = sayHello;
funcPtr(); // 调用函数
}
技巧:函数指针可实现回调和动态函数调用
四、动态内存分配
malloc
#include <stdlib.h>
int *p = (int*)malloc(sizeof(int) * 5); // 分配5个int空间
if (p == NULL) exit(1);
calloc
int *p = (int*)calloc(5, sizeof(int)); // 分配并初始化为0
realloc
p = (int*)realloc(p, sizeof(int) * 10); // 扩容
释放内存
free(p);
p = NULL; // 避免悬空指针
技巧:动态分配的内存必须手动释放,防止内存泄漏
五、指针数组与多级指针
指针数组
char *names[3] = {"Alice","Bob","Charlie"};
for(int i=0;i<3;i++) printf("%s ", names[i]);
多级指针
int a = 10;
int *p = &a;
int **pp = &p;
printf("%d ", **pp);
技巧:多级指针用于函数传指针或二维数组操作
六、内存管理注意事项
避免使用未初始化指针
动态内存使用后及时
free避免重复释放同一指针
防止野指针和悬空指针
使用工具检查内存泄漏(如Valgrind)
七、实用案例总结
动态数组操作:使用
malloc/realloc实现可变数组函数回调机制:利用函数指针实现通用处理函数
二维数组与指针数组:灵活处理矩阵和字符串表