函数参数传值
- 传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量
示例代码:
// 函数参数传值,函数内部交换2个变量的值,验证函数外部的变量有没有改变#include <stdio.h>// 函数定义void func(int m, int n) {// 函数内部交换2个变量的值int temp = m;m = n;n = temp;printf("函数内部 m = %d, n = %d\n", m, n);}int main() {int a = 10;int b = 20;// 调用函数,值传递func(a, b);printf("函数外部 a = %d, b = %d\n", a, b);return 0;}
运行结果:
函数内部 m = 20, n = 10函数外部 a = 10, b = 20
函数参数传址
- 传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。
示例代码:
// 函数参数传地址,函数内部交换2个指针指向内存的值,验证函数外部的变量有没有改变#include <stdio.h>// 函数定义void func(int *m, int *n) {// 函数内部交换2个指针指向内存的值int temp = *m;*m = *n;*n = temp;printf("函数内部 *m = %d, *n = %d\n", *m, *n);}int main() {int a = 10;int b = 20;// 调用函数,地址传递func(&a, &b);printf("函数外部 a = %d, b = %d\n", a, b);return 0;}
运行结果:
函数内部 *m = 20, *n = 10函数外部 a = 20, b = 10
函数指针
函数名
void func(int a) { printf(“func a = %d\n”, a); }
int main() { // 函数名字,就是代表函数的入口地址,函数地址 printf(“%p, %p, %p\n”, func, &func, *func);
// 3种调用方法都可以func(1); // 最简便,最常用(&func)(2);(*func)(3);return 0;
}
<a name="G5M0f"></a>## 函数指针- 函数指针:它是指针,指向函数的指针- 语法格式:```c返回值 (*函数指针变量)(形参列表);
- 函数指针变量的定义,其中返回值、形参列表需要和指向的函数匹配
#include <stdio.h>void func(int a) {printf("a = %d\n", a);}int main() {// 函数指针变量的定义,同时初始化void (*p1)(int a) = func;// 通过函数指针变量调用函数p1(10);// 先定义函数指针变量,后面再赋值void (*p2)(int);p2 = func;// 通过函数指针变量调用函数p2(20);return 0;}
回调函数
- 函数指针变量做函数参数,这个函数指针变量指向的函数就是回调函数
- 回调函数可以增加函数的通用性
- 在不改变原函数的前提下,增加新功能
#include <stdio.h>// 定义函数,函数指针做形参int calc(int a, int b, int (*p)(int, int)){// 通过函数指针变量调用函数,获取返回值int res = p(a, b);return res;}// 定义加法函数int add(int x, int y) {return x + y;}// 定义减法函数int sub(int x, int y) {return x - y;}int main() {int result;// 回调加法函数result = calc(1, 2, add);printf("result = %d\n", result);// 回调减法函数result = calc(10, 5, sub);printf("result = %d\n", result);return 0;}
