C 指针基础概念
指针是C语言的核心特性之一,用于存储变量的内存地址。通过指针可以直接操作内存,提高程序的灵活性和效率。
指针声明与初始化:
int num = 10; // 定义一个整型变量
int *ptr = # // 定义指针并初始化为num的地址
解引用指针:
通过指针修改变量值:
printf("num的值: %d\n", *ptr); // 输出10
*ptr = 20; // 修改num的值为20
指针与数组
数组名本质是指向数组首元素的指针,可以通过指针遍历数组。
指针遍历数组:
int arr[] = {1, 2, 3, 4, 5};
int *p = arr;
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i)); // 等价于arr[i]
}
指针与字符串:
字符串通过字符指针操作更高效:
char *str = "Hello";
while (*str != '\0') {
printf("%c", *str);
str++;
}
指针与函数
指针作为函数参数可实现传址调用,避免数据拷贝。
交换两个变量的值:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int x = 5, y = 10;
swap(&x, &y); // x=10, y=5
函数返回指针:
需注意返回局部变量的指针是未定义行为:
int* createArray(int size) {
int *arr = (int*)malloc(size * sizeof(int));
return arr; // 返回动态分配的内存
}
多级指针
多级指针用于存储指针的地址,常见于动态二维数组或函数参数传递。
二级指针示例:
int num = 100;
int *ptr = #
int **pptr = &ptr;
printf("num的值: %d\n", **pptr); // 输出100
动态二维数组:
int **matrix = (int**)malloc(3 * sizeof(int*));
for (int i = 0; i < 3; i++) {
matrix[i] = (int*)malloc(3 * sizeof(int));
}
指针与结构体
结构体指针通过->
操作符访问成员,避免拷贝开销。
结构体指针示例:
typedef struct {
int x;
int y;
} Point;
Point p1 = {1, 2};
Point *ptr = &p1;
printf("坐标: (%d, %d)\n", ptr->x, ptr->y);
指针作为结构体成员:
typedef struct {
char *name;
int age;
} Person;
Person person;
person.name = "Alice";
person.age = 25;
指针安全与常见错误
指针使用不当会导致程序崩溃或内存泄漏。
空指针解引用:
int *ptr = NULL;
// *ptr = 10; // 错误:解引用空指针
内存泄漏:
动态分配的内存需手动释放:
int *arr = (int*)malloc(5 * sizeof(int));
free(arr); // 必须释放
野指针:
释放后指针应置空:
free(arr);
arr = NULL; // 避免野指针
通过以上示例和说明,可以深入理解C指针的强大功能及其潜在风险。合理使用指针能大幅提升程序性能,但需谨慎避免内存问题。