• 递归、函数回调、字符的思考


    1.函数指针类型做什么工作呢(起什么作用)
      1)它规定了函数的"返回值和参数。"只要是这种它所对应的返回值和参数类型的函数,它都可以调用起来。
      2)回调函数是通过函数指针做函数参数实现的,"它的本质是:提前对函数的返回值和参数做了一个约定"

    2.数组类型和数组指针指针类型
      1)数组类型
      int arr[10]; arr代表数组首元素地址; &arr代表整个数组首地址。虽然 arr 和 &arr 的值相同,但是他们的步长不同

      2)数组类型
      typedef int (MyArr)[10]; MyArr marr; marr[0] = 10;"数组的首元素赋值为10"

      3)数组指针类型:
      typedef int (*MyTypeArr) [10]; MyTypeArr myarr = &arr;
      (*myrr)[0] = 10; "数组的首元素赋值为10"
      或直接定义数组指针
      int (*MyTypeArr) [10]; (*MyTypeArr)[0] = 20;

    3.函数指针:"(函数名就是函数的入口地址)"

      1)定义一个函数类型
      void func(int a,int b){ }

      2)定义一个函数类型
      typedef void (Myfunc)(int a,int b); Myfunc *myfunc = func; 对它的调用 myfunc(4,6);

      3)定义一个函数指针类型
      typedef void (*MyPfunc)(int a,int b); MyPfunc myfunc1 = func; 对它的调用:myfunc1(3,0);
      或者直接定义:void (*MyPfunc1)(int a, int b); MyPfunc1 = func; 对它的调用:mypfunc1(3,0);

      1 6.递归的套路:
      2     1)先判断递归结束条件
      3     2)再调递归函数(传递的参数一般与判断条件相同)。
      4 "顺序打印字符串,用递归思想"
      5 void test(const char *str)
      6 {
      7     if (NULL == str)
      8         return;
      9     if (*str == '')                “递归的第一步:递归的终结条件。”
     10         return;
     11     printf("%c ",*str);                “递归第二步:参数的传递,如下面”
     12     test(str + 1);                    "注意这里要加用 +1, 而不能用++,程序运行中可能会出问题,因为这样指针的指向就已改变"
     13 }
     14 "逆序打印字符串,用递归思想"
     15 void test01(const char *str)
     16 {
     17     if (NULL == str)
     18         return;
     19     if (*str == '')                “这里也是,一定要有递归的终结条件”
     20         return;
     21     test01(str + 1 );                “这里是这个递归函数精妙的地方,要用+1,”
     22     printf("%c ", *str);
     23 }
     24 int main(void)
     25 {
     26     char *str = "nihaoshijie";
     27     test(str);
     28     test01(str);
     29     printf("
    ");
     30     system("pause");
     31     return 0;
     32 }
     33 
     34 递归函数里 递归语句的前后是一个重要的分割点。
     35 "注意观察这两段代码的不同之处,一段打印代码的放置顺序不同,就造成了字符串的逆序和顺序打印" 36 
     37 7.对 strcmp() 函数的重写 以及 函数回调(函数指针的使用)
     38 typedef int(*camp)();
     39 //老师写的
     40 int test03()
     41 {
     42     char *dest = "Asadws";
     43     char  *src = "Bsadws";
     44     while (*dest != '' && *src != '')
     45     {
     46         if (*dest == *src)
     47         {
     48             dest++;
     49             src++;
     50         }
     51         else
     52             break;
     53     }
     54     return *dest - *src;
     55 }
     56 //自己写的
     57 int test04()
     58 {
     59     char *dest = "Asadws";
     60     char  *src = "Bsadws";
     61     while (1)
     62     {
     63         if (*dest == '' && *src == '')
     64             return 0;
     65         if (*dest == '')
     66             return -1;
     67         if (*src == '')
     68             return 1;
     69         if (*dest > *src)
     70             return 1;
     71         if (*dest < *src)
     72              return  -1;
     73         if (*dest == *src)
     74         {
     75             src++;
     76             dest++;
     77         }
     78     }    
     79 }
     80 int func1(camp c1)
     81 {
     82     int n= c1();
     83     return n;
     84 }
     85 int main(void)
     86 {
     87     int b = func1(test03);
     88     if (b == 0)
     89     printf("dest == src
    ");
     90     else if (b == 1)
     91     printf("dest > src 
    ");
     92     else
     93     printf("dest < src 
    ");
     94 
     95     int c = func1(test04);
     96     if (c == 0)
     97         printf("dest == src
    ");
     98     else if (c == 1)
     99         printf("dest > src 
    ");
    100     else
    101         printf("dest < src 
    ");
    102 
    103     return 0;
    104 }
    105 "1.这段给我最重要的思想是字符串之间本身是可以加减的,同时也可以自己比较大小。不需要额外引用其他变量。"
    106 "2.这段还用了函数回调,即函数指针的使用。"
  • 相关阅读:
    【ZJOI2007】棋盘制作 BZOJ1057
    【ZJOI2008】 树的统计 count
    【JSOI2007】麻将 bzoj 1028
    【省选】省选黄色预警
    【ZJOI2013】k大数查询 BZOJ 3110
    【HNOI2008】Cards BZOJ 1004
    【JSOI2010】Group 部落划分 BZOJ 1821
    NOIp2014 解题报告
    CH Round #56
    CH Round #55
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/5738180.html
Copyright © 2020-2023  润新知