奇奇怪怪的赋值(最好有懂一些C语言底层逻辑的)

按理说我和答案的结果应该是一样的,但为什么我的只有前两位数才可以实现他问题所要求的功能

img

img

img

i要小于10的length次方。
gets读入的字符串末尾有个\n,也可以根据这个判断字符串结束

【相关推荐】



  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7551487
  • 这篇博客也不错, 你可以看下校园导航系统(数据结构C语言邻接矩阵为存储结构和迪杰斯特拉算法求最短距离)
  • 您还可以看一下 刘安战老师的C语言程序设计(全程实践)课程中的 函数指针定义小节, 巩固相关知识点
  • 除此之外, 这篇博客: 这是我看过最全面讲解嵌入式C语言回调函数和函数指针的教程中的 一、函数指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    函数指针,顾名思义它就是一个指针,只不过它是一个函数指针,所以指向的是一个函数。类比一般的变量指针,指针变量,实质上是一个变量,只不过这个变量存放的是一个地址,在32位单片机中,任何类型的指针变量都存放的是一个大小为4字节的地址。

    
    int   a; < = > void cal_sum(void);
    int * p; < = > void (*func_ptr)(void);
    p=&a;   < = > func_ptr= &cal_sum;
    

    左边走义变量a,右边定义函数cal_sum;

    左边定义int指针,右边定义func_ptr;

    左边赋值指针,右边赋值函数指针;

    可能这样大家还是不太清楚,我是搞嵌入式单片机的,有本事你在Keil中给我举一个例子啊?

    可以啊,没问题,请看!

    #include "sys.h"
    #include "led.h"
    #include "delay.h"
    #include "usart.h"
    
    uint8_t cal_sum(uint8_t a, uint8_t b)
    {
        return a + b;
    }
    
    int main(void)
    {
        delay_init();
        uart_init(9600);
    
        printf("www.zhiguoxin.cn\r\n");
        printf("微信公众号:果果小师弟\r\n");
    
        uint8_t a = 10;
        uint8_t b = 8;
    
        /*定义一个函数指针*/
        uint8_t (*func_ptr)(uint8_t, uint8_t);
        /*将函数名赋值给函数指针*/
        func_ptr = cal_sum;
    
        printf("cal_sum_address  =0x%p\r\n", cal_sum);
        printf("func_ptr_address =0x%p\r\n", func_ptr);
        printf("%d + %d = %d\r\n", a, b, cal_sum(a, b));
        printf("%d + %d = %d\r\n", a, b, func_ptr(a, b));
    
        while(1)
        {
        }
    }
    

    这样写大家应该很熟悉吧,我首先定义了一个函数指针func_ptr,接着将我写得cal_sum函数赋值给了函数指针func_ptr 。然后分别打印函数cal_sum的地址,函数指针func_ptr的地址,以及使用cal_sum计算出来的值,和函数值指针func_ptr计算出来的值。

    那么结果是啥样呢?

    可以发现函数指针func_ptrcal_sum函数的存储的地址以及他们所计算出来的值是一样的。

    比如在上面求两个数和的基础上再求两个数的乘积和差,会是啥样的呢?

    代码是这样的

    #include "sys.h"
    #include "led.h"
    #include "delay.h"
    #include "usart.h"
    
    uint8_t cal_sum(uint8_t a, uint8_t b)
    {
        return a + b;
    }
    
    uint8_t cal_sub(uint8_t a, uint8_t b)
    {
        return a - b;
    }
    
    uint8_t cal_mul(uint8_t a, uint8_t b)
    {
        return a * b;
    }
    
    int main(void)
    {
        delay_init();
        uart_init(9600);
    
        printf("www.zhiguoxin.cn\r\n");
        printf("微信公众号:果果小师弟\r\n");
    
        uint8_t a = 10;
        uint8_t b = 8;
    
        /*定义一个函数指针*/
        uint8_t (*func_ptr)(uint8_t, uint8_t);
        /*将函数名赋值给函数指针*/
        func_ptr = cal_sum;
    
        printf("cal_sum_address  =0x%p\r\n", cal_sum);
        printf("func_ptr_address =0x%p\r\n", func_ptr);
        printf("%d + %d = %d\r\n", a, b, cal_sum(a, b));
        printf("%d + %d = %d\r\n\n", a, b, func_ptr(a, b));
    
        /*将函数名赋值给函数指针*/
        func_ptr = cal_sub;
    
        printf("cal_sub_address  =0x%p\r\n", cal_sub);
        printf("func_ptr_address =0x%p\r\n", func_ptr);
        printf("%d - %d = %d\r\n", a, b, cal_sub(a, b));
        printf("%d - %d = %d\r\n\n", a, b, func_ptr(a, b));
    
        /*将函数名赋值给函数指针*/
        func_ptr = cal_mul;
    
        printf("cal_mul_address  =0x%p\r\n", cal_mul);
        printf("func_ptr_address =0x%p\r\n", func_ptr);
        printf("%d * %d = %d\r\n", a, b, cal_mul(a, b));
        printf("%d * %d = %d\r\n", a, b, func_ptr(a, b));
    
        while(1)
        {
        }
    }
    

    截个图看的更清楚一点

    串口打印结果:

    指向函数的指针被称作是函数指针。通过函数指针,我们可以灵活的调用各种形式相同,但是功能不同的函数这样做大大的增加了代码的灵活程度。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^