• 2022/11/27[指针] 指针与函数基础


    程序:求10个数的最大数

    1、定义指向函数的指针变量调用函数的方法

     一般定义形式为:类型名 (*指针变量名)();

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int i, m, a[10], max(int* p);
    5. int (*f)();
    6. for (i = 0; i < 10; i++)
    7. scanf_s("%d", &a[i]);
    8. f = max;//max就是函数的地址,f也是地址
    9. m = (*f)(a);//a是实参
    10. printf("max=%d\n", m);
    11. return 0;
    12. }
    13. max(int* p)
    14. {
    15. int i, t = *p;
    16. for (i = 1; i < 10; i++)
    17. if (*(p + i) > t)
    18. t = *(p + i);
    19. return t;
    20. }

    注意,指针变量的数据类型必须与被指向的函数类型一致

    2、用指向函数的指针作为函数参数

    在函数调用时把某几个函数的首地址传递给被调用函数,在被调用函数中就可以调用这几个函数了。

    程序:编制函数func(),调用实现不同的功能:max,min,sum.

    代码如下:

    1. #include
    2. int max(int a, int b);
    3. int min(int a, int b);
    4. int sum(int a, int b);
    5. void func(int a, int b, int(*fun)(int a, int b));
    6. int main()
    7. {
    8. int x, y;
    9. printf("enter 2 num:\n");
    10. scanf_s("%d%d", &x, &y);
    11. printf("max = ");
    12. func(x, y, max);//max必须先定义为一个函数,以下同理
    13. printf("min = ");
    14. func(x, y, min);
    15. printf("sum = ");
    16. func(x, y, sum);
    17. }
    18. void func(int a, int b, int (* fun)(int a, int b))
    19. {
    20. int result;
    21. result = (*fun)(a, b);
    22. printf("%d\n", result);
    23. }
    24. int max(int a, int b)
    25. {
    26. int c;
    27. c = (a > b) ? a : b;
    28. return c;
    29. }
    30. int min(int a, int b)
    31. {
    32. int c;
    33. c = (a < b) ? a : b;
    34. return c;
    35. }
    36. int sum(int a, int b)
    37. {
    38. int c;
    39. c = a + b;
    40. return c;
    41. }

    第一次调用func函数时,除了将x,y传递给形参a,b外,还将函数名max作为实参传递给形参fun,这是fun指向函数max();此时,func函数中的(*fun)(a,b)相当于max(a,b).

    3、返回指针值的函数

    一般定义类型为:

    类型名 *函数名(参数表) 

    例如:int *maxc(int x, int y)表示调用后可以得到一个指向整型数据的指针(地址)。

    *的运算级低于(),因此maxc先于()结合,表明maxc是函数名。*表示此函数返回值类型是指针。

    程序1:下列函数把两个整数形参中较大的那个数的地址作为函数值传回

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int* maxc(int x, int y);//maxc函数返回的类型是地址!
    5. int* p, i, j;
    6. printf("enter two number\n");
    7. scanf_s("%d%d" ,&i, &j);
    8. p = maxc(i, j);//p作为地址
    9. printf("max=%d\n", *p);
    10. return 0;
    11. }
    12. int* maxc(int x, int y)
    13. {
    14. int* z;
    15. if (x > y)
    16. z = &x;
    17. else
    18. z = &y;
    19. return z;
    20. }

    结果如下:

    程序2:有3个学生,每个学生有4门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。

    1. #include<stdio.h>
    2. int main()
    3. {
    4. float score[][4] = { {60,70,80,90},{56,89,67,88},{34,78,90,66} };
    5. float* search(float(*pointer)[4], int n);//函数形参为指向行的指针
    6. float* p;
    7. int i, k;
    8. printf("enter the number of student:");
    9. scanf_s("%d", &k);
    10. printf("the scores of NO.%d are:\n", k);
    11. p = search(score, k);//p是地址
    12. for (i = 0; i < 4; i++)
    13. printf("%5.2f\t", *(p + i));//这里的p已经是&score[][0]了
    14. printf("\n");
    15. return 0;
    16. }
    17. float* search(float(*pointer)[4], int n)
    18. {
    19. float* pt;
    20. pt = *(pointer + n - 1);//第n位同学的列地址&score[n-1][0]
    21. return pt;
    22. }

    结果如下:

     

    指针变量总结:

     

  • 相关阅读:
    go RWMutex 的实现
    OpenAI 最佳平替,使用 Promptulate 增强你的AI能力
    微信小程序之微信授权登入及授权的流程讲解
    Linux 启动流程及相关知识
    linux安装docker步骤
    VBA技术资料MF54:VBA_EXCEL实时获取鼠标位置
    BSN开放联盟链“武汉链”新版浏览器wuscan.io正式上线发布
    Go 工具链详解(五):竞态条件检测神器 Race Detector
    就在刚刚这份java八股文成功让我进入字节,拿到了人生第一个18k
    Datax开启远程调试
  • 原文地址:https://blog.csdn.net/fangzelin5/article/details/128062828