• c20---指向函数的指针


    //
    //  main.c
    //  指向函数的指针
    
    #include <stdio.h>
    
    void test()
    {
        printf("哥被执行了
    ");
    }
    
    int getAge()
    {
        return 30;
    }
    
    void sum(int v1, int v2)
    {
        int res = v1 +  v2;
        printf("res = %i
    ", res);
    }
    
    int sum2(int v1 , int v2)
    {
        int res = v1 + v2;
        return  res;
    }
    
    // 函数也会占用一块存储空间
    // 因为函数也会占用一块存储空间所以函数也由自己的地址
    // 函数的地址保存在函数名中
    // 函数名就是函数的地址 == 数组名就是数组的地址
    int main(int argc, const char * argv[]) {
        
        printf("test = %p
    ", test);//0x100000f00
        /*
         
         没有返回值没有参数
         没有返回值有参数
         有返回值没有参数
         有返回值有参数
         
         指向函数的指针的定义格式
         void (*funtionP) ();
         
         *    : 代表是一个指针
         funtionP    : 代表指针变量的名称, 区分
         (*funtionP) : 代表将来指向一个函数
         void : 代表将来指向的函数没有返回值
         ()   : 代表将来指向的函数没有参数
         
         
         普通指针的定义格式
         数据类型 *指针变量名称
         int *p;
         */
        
        
        void (*funtionP) ();
        funtionP = test; // 注意: 千万不能写成test()
        test(); // 0x100000f00();
        (*funtionP)(); //函数调用, funtionP是一个地址,*funtionP获取地址的值,
        // test == funtionP
        funtionP();    ////函数调用,
        
        int num = 10;
        int *p = &num;
        printf("%i
    ", *p);
        
        int ages[] = {1 , 3 ,5};
        int *p;
        p = ages; // ages就是数组的地址
        // p == ages;
        // ages[0];
        // p[0];
        // *(p + n);
        
    
        int (*ageP)();
        ageP = getAge;
        printf("age = %i
    ", ageP());
        
        // void (*sumP)(int v1, int v2);
        void (*sumP)(int, int);
        sumP = sum;
        sumP(10, 20);
    
        
        int (*sumP2)(int , int);
        sumP2 = sum2;
        printf("sum = %i
    ", sumP2(10, 20));
        
        return 0;
    }
    //
    //  main.c
    //  指向函数的指针的应用场景
    
    #include <stdio.h>
    
    int sum(int v1, int v2)
    {
        return v1 + v2;
    }
    
    int minus(int v1, int v2)
    {
        return v1 - v2;
    }
    
    // 让demo接受一个指向函数的指针
    // 以后我们只需要给demo函数传递对应的指针, 那么函数内部就可以调用不同的函数
    int demo(int v1, int v2)
    {
        return minus(v1, v2);
    }
    
    int demo2(int v1, int v2)
    {
        return sum(v1, v2);
    }
    
    int demo3(int v1, int v2, int (*p)(int, int) )  //回调函数
    {
        return p(v1, v2);
    }
    
    int main(int argc, const char * argv[]) {
        // 定义一个方法, 给你两个数, 用户要求你做加法你就做加法, 用户要求你做减法, 那你就做减法
    //    printf("sum = %i
    ", sum(10, 20));
    //    printf("minus = %i
    ", minus(20, 10));
        
    //    printf("minus = %i
    ", demo(20 , 10));
    //    printf("sum = %i
    ", demo2(20 , 10));
        
        printf("mins = %i
    ", demo3(20, 10, minus));
        printf("sum = %i
    ", demo3(20, 10, sum));
        
        return 0;
    }
    //
    //  main.c
    //  指向函数的指针练习
    //  数组的指针类型加1是移到下一个元素位置的地址,通过*temp可以取得该位置的值。
    
    #include <stdio.h>
    char upper(char value);
    void upperCase(char *p);
    //void ts(char *temp);
    void ts(char *temp, void (*funtionP)(char *));
    
    int main(int argc, const char * argv[]) {
        // 需求: 要求用户输入一段英文, 将用户输入的英文单词所有的首字母大写
        // hello world --> Hello World 
        
        // 1.接收用户输入的字符串
        // 2.遍历字符串, 判断当前字符是否是空格, 如果是空格就将下一个字符转换为大写
        
        // 1.先实现接受字符串
        // 2.再实现字母的大小写转换
        // 3.再实现替换字符串中的单词首字符
        
        printf("请输入一句英文, 单词之间用空格隔开
    ");
        //    char *str;
        char str[100];
        //  scanf("%s", str);
        gets(str);
        printf("str = %s", str);
        
        
        char c = 'a'; // + - 1
        //  printf("c = %c
    ", upper(c));
        upperCase(&c);
        // *p == c
        printf("c = %c
    ", c);
        
        
        // 1.接收用户输入的数据
        printf("请输入一句英文, 单词之间用空格隔开
    ");
        char str[100];
        gets(str);
        // 注意: 数组名称不能做+1操作, 只有指针才可以
        printf("str = %s
    ", str);
        
        char *temp = str;
        // 2.遍历字符串
        upperCase(temp);
        // temp == &str[0]
        while (*temp != '') { // h e l l o 空格 w,获取指针位置的值,
            // 如果等于空格就需要将下一个字符转换为大写
            if ((*temp) == ' ') {
                upperCase(++temp);
            }else{
                temp++; // 指针加1,移到下一个元素位置,数组的指针类型加1是移到下一个元素位置的地址,通过*temp可以取得该位置的值。
            }
        }
        
        ts(str, upperCase);
        
        printf("str = %s", str);
        
        return 0;
    }
    
    void ts(char *temp, void (*funtionP)(char *))
    {
        // 1.不管三七二十一先将第一个字母转换为大写
        upperCase(temp);
        // temp == &str[0]
        while (*temp != '') { // h e l l o 空格 w
            // 2.1取出当前的字符, 判断是否等于 空格, 如果等于空格就需要将下一个字符转换为大写
            if ((*temp) == ' ') {
                // 2.2将下一个字符转换为大写
    //            upperCase(++temp); // temp == &str[6]; == w
                funtionP(++temp);
            }else
            {
                temp++; // temp == &str[7];
            }
        }
    
    }
    
    
    void upperCase(char* p)
    {
        // 1.判断是否是小写字母
        if (*p >= 'a' && *p <= 'z') {
            // 2.将小写字母转换为大写字母
            *p = *p - ('a'  - 'A'); // 32 小写的ascii大于大写
        }
    }
    char upper(char value)
    {
        // 1.判断是否是小写字母
        if (value >= 'a' && value <= 'z') {
            // 2.将小写字母转换为大写字母
            value = value - ('a'  - 'A'); // 32 小写的ascii大于大写
        }
        return value;
    }
  • 相关阅读:
    ARM应用笔记网址和常见问题
    ARM处理器中断处理的编程实现(转)
    altera_avalon_pio_regs.h中的函数意义
    keil 启动代码at91sam9260
    转载:"IF :DEF: EN_CRP"这一句是什么意思啊?
    Realview MDK中启动代码的配置详解
    转载 网络上的8051 free IP core资源
    keil下ARM启动代码分析视频
    SOPC方面的书籍
    NIOS的system.h解读PIO实现的LED灯和key
  • 原文地址:https://www.cnblogs.com/yaowen/p/7390693.html
Copyright © 2020-2023  润新知