前言
今天学习了风哥的ADC动态窗口采集代码,其中的传参方式让我感到疑惑,特别是不明白为什么要使用指针传参而不是直接传值。这种细节让我困惑了很久,直到在 G 老师的帮助下,终于弄清楚了值传递和指针传递的核心区别以及它们的应用场景。为了加深理解,也为了以后遇到类似问题能够快速回忆起来,我决定把两者的区别和实际应用场景记录下来,与大家分享。
C 语言中的指针传递与值传递
在 C 语言中,函数参数默认是通过值传递的,但在实际编程中,我们常常使用指针传递来解决复杂问题。本文将深入解析这两种方式的本质、区别以及应用场景,帮助大家更好地理解这两个概念。
1. 什么是值传递?
值传递(Call by Value)是 C 语言中默认的函数参数传递方式。它的特点是:
- 在函数调用时,将实际参数的值复制一份传递给函数。
- 函数内部操作的是副本,而非实际变量。
- 函数对参数的任何修改都不会影响原始变量的值。
示例代码:值传递
#include <stdio.h>
void increment_by_value(int count)
{
count++; // 修改的是count的副本
printf("Inside function: count = %d\n", count);
}
int main()
{
int count = 10;
increment_by_value(count); // 传递值的副本
printf("After function: count = %d\n", count); // 原值未变
return 0;
}
运行结果:
Inside function: count = 11
After function: count = 10
分析
- 在
increment_by_value
函数中,count
的值被修改为 11,但这仅仅是副本,原始变量count
在函数外仍然保持不变。
2. 什么是指针传递?
指针传递(Call by Reference)是通过传递变量的地址(指针)来实现参数的修改。它的特点是:
- 函数接收的是实际变量的内存地址。
- 函数内部可以直接通过指针访问并修改原始变量的值。
- 这种方式允许函数对调用者的变量产生影响。
示例代码:指针传递
#include <stdio.h>
void increment_by_pointer(int *count)
{
(*count)++; // 修改的是指针指向的实际变量
printf("Inside function: count = %d\n", *count);
}
int main()
{
int count = 10;
increment_by_pointer(&count); // 传递变量的地址
printf("After function: count = %d\n", count); // 原值被修改
return 0;
}
运行结果:
Inside function: count = 11
After function: count = 11
分析
- 在
increment_by_pointer
函数中,通过指针count
的解引用*count
直接修改了原始变量count
的值。 - 函数外部的变量也随之改变。
3. 值传递与指针传递的区别
特性 | 值传递 | 指针传递 |
---|---|---|
传递内容 |