指针是C语言的核心特性之一,它存储的是另一个变量的地址。通过指针,我们可以直接访问和修改变量的值,也可以实现动态内存分配。
int var = 5;int *ptr = &var;printf("Value of var: %d\n", *ptr); // 输出:Value of var: 5指针的运算指针可以进行自增(++)和自减(--)运算,指向下一个或上一个地址。指针间的减法可以用来计算两个地址之间的距离。
int arr[3] = {10, 20, 30};int *ptr1 = &arr[0];int *ptr2 = &arr[2];printf("Distance between ptr1 and ptr2: %ld\n", ptr2 - ptr1); // 输出:Distance between ptr1 and ptr2: 2指针与数组数组名是一个指向数组首元素的指针。通过指针访问数组元素时,可以使用指针的算术运算。
int arr[3] = {10, 20, 30};int *ptr = arr; // 数组名作为指针for (int i = 0; i < 3; i++) { printf("Array element %d: %d\n", i, *(ptr + i));}多级指针指针的指针,即指向指针的指针,可以用来访问和修改变量的地址。
int var = 5;int *ptr1 = &var;int **ptr2 = &ptr1;printf("Value of var via multi-level pointer: %d\n", **ptr2); // 输出:Value of var via multi-level pointer: 5函数指针函数指针指向函数的代码,可以通过函数指针调用函数。
void printHello() { printf("Hello, world!\n");}int main() { void (*funcPtr)() = printHello; funcPtr(); // 调用函数 return 0;}动态内存分配C语言提供了malloc()、calloc()、realloc()和free()函数来动态管理内存。动态内存分配允许在程序运行时根据需要分配和释放内存。
int *dynamicArray = (int*)malloc(3 * sizeof(int));dynamicArray[0] = 10;dynamicArray[1] = 20;dynamicArray[2] = 30;free(dynamicArray); // 释放内存野指针和空指针未初始化的指针可能导致程序行为不可预测,称为野指针。空指针是一个特殊的指针值,表示没有指向任何地址。
int *ptr; // 未初始化的指针,可能是野指针ptr = NULL; // 空指针,安全内存泄露动态分配的内存如果没有被正确释放,会导致内存泄露。使用free()函数及时释放不再使用的动态内存。
int *ptr = (int*)malloc(sizeof(int));*ptr = 10;free(ptr); // 避免内存泄露总结:C语言的指针和内存管理是进阶必备的技能,理解指针的概念和运算,能够高效地操作数组和函数,掌握动态内存分配和释放,避免野指针和内存泄露的问题,是编写高效、稳定C程序的关键。