zoukankan      html  css  js  c++  java
  • 第36课 函数与指针分析

    函数类型:

    函数指针:

    面试小问题:

    如何使用C语言直接跳转到某个固定的地址开始执行?

    函数指针的使用:

     1 #include <stdio.h>
     2 
     3 typedef int(FUNC)(int);
     4 
     5 int test(int i)
     6 {
     7     return i * i;
     8 }
     9 
    10 void f()
    11 {
    12     printf("Call f()...
    ");
    13 }
    14 
    15 int main()
    16 {
    17     FUNC* pt = test;
    18     void(*pf)() = &f;
    19     
    20     printf("pf = %p
    ", pf);
    21     printf("f = %p
    ", f);
    22     printf("&f = %p
    ", &f);
    23     
    24     pf();
    25     
    26     (*pf)();
    27     
    28     printf("Function pointer call: %d
    ", pt(2));
    29     
    30     return 0;
    31 }

    函数名取不取地址,它的意义是相同的,这和数组不一样。

    运行结果如下:

    知道了函数地址,我们在18行直接给函数名用地址赋值,结果如下:

    我们可以得到结论,C语言中可以直接跳转到某个固定的地址执行。

    回调函数:

    回调函数示例:

     1 #include <stdio.h>
     2 
     3 typedef int(*Weapon)(int);
     4 
     5 void fight(Weapon wp, int arg)
     6 {
     7     int result = 0;
     8     
     9     printf("Fight boss!
    ");
    10     
    11     result = wp(arg);
    12     
    13     printf("Boss loss: %d
    ", result);
    14 }
    15 
    16 int knife(int n)
    17 {
    18     int ret = 0;
    19     int i = 0;
    20     
    21     for(i=0; i<n; i++)
    22     {
    23         printf("Knife attack: %d
    ", 1);
    24         ret++;
    25     }
    26     
    27     return ret;
    28 }
    29 
    30 int sword(int n)
    31 {
    32     int ret = 0;
    33     int i = 0;
    34     
    35     for(i=0; i<n; i++)
    36     {
    37         printf("Sword attack: %d
    ", 5);
    38         ret += 5;
    39     }
    40     
    41     return ret;
    42 }
    43 
    44 int gun(int n)
    45 {
    46     int ret = 0;
    47     int i = 0;
    48     
    49     for(i=0; i<n; i++)
    50     {
    51         printf("Gun attack: %d
    ", 10);
    52         ret += 10;
    53     }
    54     
    55     return ret;
    56 }
    57 
    58 int main()
    59 {
    60     fight(knife, 3);
    61     fight(sword, 4);
    62     fight(gun, 5);
    63     
    64     return 0;
    65 }

    运行结果如下:

    函数指针的关键使用场合就是用来实现回调机制。

    小结:

  • 相关阅读:
    187A Permutations
    DFS 专题 哈密顿绕行世界问题
    DFS 专题 N皇后
    DFS专题 Prime Ring Problem
    USACO section1.1 Broken Necklace
    USACO section1.2 Dual Palindromes
    PHPUnitWriting Tests for PHPUnit
    PHP 定界符 使用技巧
    concat函数
    mysql_free_result
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9551103.html
Copyright © 2011-2022 走看看