指针的基本概念
指针是C语言中一种特殊的变量,用于存储另一个变量的内存地址。通过指针可以直接访问或修改内存中的数据,为动态内存管理和高效数据操作提供了基础。
指针变量的声明方式为:数据类型 *指针变量名。例如:
int *p; // 声明一个指向整型的指针
指针的初始化与赋值
指针在使用前必须初始化,可以指向已存在的变量或动态分配的内存。未初始化的指针称为“野指针”,可能导致程序崩溃。
int a = 10;
int *p = &a; // 将变量a的地址赋值给指针p
// 动态内存分配
int *q = (int*)malloc(sizeof(int));
*q = 20;
指针的运算
指针支持有限的算术运算,包括加减整数和指针相减(仅限同类型指针):
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
p++; // 指向下一个元素(地址增加sizeof(int))
指针相减的结果是两指针之间的元素个数:
int *p1 = &arr[0];
int *p2 = &arr[3];
int diff = p2 - p1; // 结果为3
指针与数组的关系
数组名本质上是一个指向数组首元素的常量指针。可以通过指针访问数组元素:
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d", *(p+1)); // 输出20
多级指针
指针可以指向其他指针,形成多级指针(如二级指针):
int a = 100;
int *p = &a;
int **pp = &p; // 二级指针
printf("%d", **pp); // 输出100
指针与函数
指针可以作为函数参数,实现“按引用传递”的效果:
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
int main() {
int a = 5, b = 10;
swap(&a, &b); // a和b的值被交换
}
函数指针
函数指针指向函数而非数据,可用于实现回调机制:
int add(int a, int b) { return a + b; }
int (*funcPtr)(int, int) = add; // 声明函数指针
printf("%d", funcPtr(2, 3)); // 输出5
动态内存管理
通过指针配合malloc、calloc、realloc和free函数实现动态内存分配:
int *arr = (int*)malloc(5 * sizeof(int)); // 分配5个int的空间
if (arr != NULL) {
for (int i = 0; i < 5; i++) arr[i] = i;
free(arr); // 释放内存
}
常见指针错误
空指针解引用:对未初始化或已释放的指针进行操作会导致程序崩溃。
指针越界:访问超出分配内存范围的地址可能引发不可预知的行为。
内存泄漏:忘记释放动态分配的内存会导致程序内存消耗持续增加。
类型不匹配:不同类型的指针相互赋值可能引发警告或错误(除void*外)。
1528

被折叠的 条评论
为什么被折叠?



