刚学 C 语言的朋友,是不是总在函数传参这儿栽跟头?比如想在函数里改个变量的值,改完发现外面一点没变;或者传个数组进去,不知道咋用函数处理才方便。其实啊,这都是没搞懂指针和函数结合的用法。今天兔子哥就拿 3 个实战案例,给你讲讲指针咋跟函数搭配,传参技巧到底咋回事,保证新手也能看明白,一起往下看吧!
案例一:通过指针修改函数外部的变量
你肯定遇到过这种情况:写个函数想改外面的变量,比如交换两个数的值,结果函数里改了,外面打印还是原来的数。这是为啥?
因为普通的函数传参是 “值传递”,就像把变量的值复印一份递给函数,函数改的是复印件,原件根本没变。那咋才能改原件呢?用指针啊,把变量的地址传过去,函数拿着地址直接改原件。
看个例子:
c运行
// 不用指针的交换函数(没用)void swap_no_ptr(int a, int b) {int temp = a;a = b;b = temp;}// 用指针的交换函数(管用)void swap_with_ptr(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}// 主函数里调用int main() {int x = 10, y = 20;swap_no_ptr(x, y); // 传值,白忙活printf("不用指针:x=%d, y=%d\n", x, y); // 还是10和20swap_with_ptr(&x, &y); // 传地址,&是取地址符printf("用指针:x=%d, y=%d\n", x, y); // 变成20和10return 0;}是不是很明显?用指针传参时,函数能直接操作原变量,这就是 “地址传递” 的好处。新手常犯的错是啥?传参时忘了加 &,或者函数里用 a instead of *a,你可得注意。
案例二:指针作为函数返回值,返回多个结果
函数不是只能返回一个值吗?可有时候咱们需要函数返回好几个结果,比如计算两个数的和与差,这时候指针就能派上用场了。
咋做呢?可以定义指针变量接收结果,把指针传给函数,函数里直接给这些指针指向的变量赋值。
看例子:
c运行
// 计算和与差,用指针返回结果void calc(int a, int b, int *sum, int *diff) {*sum = a + b; // 把和存到sum指向的变量*diff = a - b; // 把差存到diff指向的变量}int main() {int num1 = 30, num2 = 15;int s, d;calc(num1, num2, &s, &d); // 传s和d的地址过去printf("和:%d,差:%d\n", s, d); // 能拿到45和15return 0;}这种方法是不是比写两个函数分别算和与差方便多了?用指针当 “出口”,一个函数能返回一堆结果。不过要注意,别让函数返回局部变量的指针,局部变量在函数结束后就没了,指针指过去会出乱子。
案例三:数组名当函数参数(本质是指针)
数组传参的时候,你是不是发现函数里没法用 sizeof 算数组长度?因为数组名传过去其实是个指针,指向数组第一个元素,根本不是整个数组。
这时候用指针处理数组反而更灵活,比如遍历数组、修改元素啥的。
看例子,给数组每个元素加 10:
c运行
// 用指针给数组元素加10void add_ten(int *arr, int len) {for (int i = 0; i < len; i++) {*(arr + i) += 10; // 等价于 arr[i] += 10}}int main() {int nums[] = {1, 2, 3, 4};int length = 4; // 得自己传数组长度,函数里算不了add_ten(nums, length); // 数组名就是指针,直接传// 打印结果,应该是11,12,13,14for (int i = 0; i < length; i++) {printf("%d ", nums[i]);}return 0;}为啥数组名能直接传?因为数组名本身就是第一个元素的地址,和指针本质一样。这里的
*(arr + i)其实就是arr[i],两种写法都行,指针写法有时候处理起来更灵活,比如移动指针遍历数组。可能有人会问,这些用法看着简单,实际写的时候还是会错咋办?很正常,兔子哥刚开始用的时候,要么忘了加 *,要么传参时漏了 &,调试半天才发现。我的办法是啥?写代码的时候慢一点,每一步都想清楚:这个指针指向谁?传过去的是值还是地址?
其实指针和函数结合,核心就一句话:想让函数影响外部变量,就传它的地址(用指针);只想用变量的值,就传值。这三个案例吃透了,大部分传参问题都能解决。
最后说句掏心窝子的,别觉得指针难就躲着不用。C 语言的灵活劲儿全在指针上,尤其是和函数搭配,用熟了写代码会特别顺手。多敲几遍上面的例子,改改参数试试,慢慢就有感觉了,真的!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~