指针是C语言中最强大但也最容易出错的特征之一。指针本质上是一个变量,其值为另一个变量的内存地址。
int*
、char*
等,这决定了指针运算的行为在C语言中,将局部变量的地址(指针)传递给函数是一种常见做法,但需要注意局部变量的生命周期。
#include <stdio.h>
// 函数接收int指针参数
void modifyValue(int *ptr) {
*ptr = 20; // 通过指针修改原始变量的值
}
int main() {
int localVar = 10; // 局部变量
printf("Before: %d\n", localVar); // 输出: Before: 10
// 传递局部变量的地址
modifyValue(&localVar);
printf("After: %d\n", localVar); // 输出: After: 20
return 0;
}
void changePointer(int *ptr) {
int x = 20;
ptr = &x; // 只修改了局部指针副本
}
// 正确做法:如果需要修改指针本身,需要传递指针的指针
void changePointerCorrect(int **ptrPtr) {
int x = 20;
*ptrPtr = &x;
}
char* badString() {
char str[] = "Hello";
return str; // 错误!str是局部数组
}
// 正确做法1:使用静态变量(但有线程安全问题)
char* betterString() {
static char str[] = "Hello";
return str;
}
// 正确做法2:动态分配内存
char* bestString() {
char *str = malloc(6);
if(str) strcpy(str, "Hello");
return str; // 调用者需要free
}
int arr[5] = {1,2,3,4,5};
int *p = arr;
p += 10; // 越界访问
*p = 100; // 未定义行为
// 正确做法:确保指针始终在有效范围内
指针是C语言的核心概念,正确使用指针可以编写出高效灵活的程序。将局部变量作为指针传递时,关键是要理解变量的生命周期和作用域,避免返回指向局部变量的指针或访问已释放的内存。合理使用指针可以优化程序性能,但不当使用也会导致难以调试的内存错误。
没有搜到相关的文章