写代码时,经常遇到需要修改变量值的场景。比如你在做一个小工具,想通过一个函数把某个数值翻倍,结果发现函数里改了,外面还是老样子。这时候问题很可能出在函数参数的传递方式上。
为什么普通传参改不了变量?
假设你写了这样一个函数:
void doubleValue(int x) {
x = x * 2;
}
然后在主函数中调用:
int num = 5;
doubleValue(num);
// 此时num还是5
原因很简单:C语言默认是值传递,函数拿到的是变量的“复印件”,改它不影响原变量。
指针登场:直接操作内存地址
要真正改变外部变量,就得让函数知道它的内存地址。这就是指针的作用。把上面的函数改成指针传参:
void doubleValue(int* ptr) {
*ptr = *ptr * 2;
}
调用时传地址:
int num = 5;
doubleValue(&num);
// 现在num变成了10
这里 *ptr 表示取指针指向的值,&num 是取变量num的地址。这样一来,函数就能直接操作原始数据了。
实际应用场景
这种技巧在处理结构体、动态数组或者需要返回多个值的时候特别有用。比如你想同时得到除法的商和余数:
void divide(int a, int b, int* quotient, int* remainder) {
*quotient = a / b;
*remainder = a % b;
}
调用时:
int q, r;
divide(10, 3, &q, &r);
// q = 3, r = 1
这种写法比单独写两个函数清晰多了,尤其在封装底层逻辑时很常见。
小心使用,避免崩溃
指针虽强,但用不好容易出事。最常见的就是传了空指针(NULL)进去,程序直接崩掉。所以写这类函数时最好加个判断:
void setValue(int* ptr, int val) {
if (ptr != NULL) {
*ptr = val;
}
}
别嫌麻烦,这一行检查能省去很多调试时间。
在开发小工具或性能敏感的模块时,合理使用指针传参,能让代码更高效、接口更灵活。关键是理解清楚:你要传的是“值”还是“位置”。搞明白这点,很多问题就迎刃而解了。