函数参数传值

  • 传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量

示例代码:

  1. // 函数参数传值,函数内部交换2个变量的值,验证函数外部的变量有没有改变
  2. #include <stdio.h>
  3. // 函数定义
  4. void func(int m, int n) {
  5. // 函数内部交换2个变量的值
  6. int temp = m;
  7. m = n;
  8. n = temp;
  9. printf("函数内部 m = %d, n = %d\n", m, n);
  10. }
  11. int main() {
  12. int a = 10;
  13. int b = 20;
  14. // 调用函数,值传递
  15. func(a, b);
  16. printf("函数外部 a = %d, b = %d\n", a, b);
  17. return 0;
  18. }

运行结果:

  1. 函数内部 m = 20, n = 10
  2. 函数外部 a = 10, b = 20

函数参数传址

  • 传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

示例代码:

  1. // 函数参数传地址,函数内部交换2个指针指向内存的值,验证函数外部的变量有没有改变
  2. #include <stdio.h>
  3. // 函数定义
  4. void func(int *m, int *n) {
  5. // 函数内部交换2个指针指向内存的值
  6. int temp = *m;
  7. *m = *n;
  8. *n = temp;
  9. printf("函数内部 *m = %d, *n = %d\n", *m, *n);
  10. }
  11. int main() {
  12. int a = 10;
  13. int b = 20;
  14. // 调用函数,地址传递
  15. func(&a, &b);
  16. printf("函数外部 a = %d, b = %d\n", a, b);
  17. return 0;
  18. }

运行结果:

  1. 函数内部 *m = 20, *n = 10
  2. 函数外部 a = 20, b = 10

函数指针

函数名

  • 一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址 ```c

    include

void func(int a) { printf(“func a = %d\n”, a); }

int main() { // 函数名字,就是代表函数的入口地址,函数地址 printf(“%p, %p, %p\n”, func, &func, *func);

  1. // 3种调用方法都可以
  2. func(1); // 最简便,最常用
  3. (&func)(2);
  4. (*func)(3);
  5. return 0;

}

  1. <a name="G5M0f"></a>
  2. ## 函数指针
  3. - 函数指针:它是指针,指向函数的指针
  4. - 语法格式:
  5. ```c
  6. 返回值 (*函数指针变量)(形参列表);
  • 函数指针变量的定义,其中返回值、形参列表需要和指向的函数匹配
  1. #include <stdio.h>
  2. void func(int a) {
  3. printf("a = %d\n", a);
  4. }
  5. int main() {
  6. // 函数指针变量的定义,同时初始化
  7. void (*p1)(int a) = func;
  8. // 通过函数指针变量调用函数
  9. p1(10);
  10. // 先定义函数指针变量,后面再赋值
  11. void (*p2)(int);
  12. p2 = func;
  13. // 通过函数指针变量调用函数
  14. p2(20);
  15. return 0;
  16. }

回调函数

  • 函数指针变量做函数参数,这个函数指针变量指向的函数就是回调函数
  • 回调函数可以增加函数的通用性
    • 在不改变原函数的前提下,增加新功能
  1. #include <stdio.h>
  2. // 定义函数,函数指针做形参
  3. int calc(int a, int b, int (*p)(int, int)){
  4. // 通过函数指针变量调用函数,获取返回值
  5. int res = p(a, b);
  6. return res;
  7. }
  8. // 定义加法函数
  9. int add(int x, int y) {
  10. return x + y;
  11. }
  12. // 定义减法函数
  13. int sub(int x, int y) {
  14. return x - y;
  15. }
  16. int main() {
  17. int result;
  18. // 回调加法函数
  19. result = calc(1, 2, add);
  20. printf("result = %d\n", result);
  21. // 回调减法函数
  22. result = calc(10, 5, sub);
  23. printf("result = %d\n", result);
  24. return 0;
  25. }