C语言也是调用函数,也有库函数和其他第三方函数,
换一个角度学习STM32就是对函数库的学习,再换一个角度就是学习C语言的第三方函数,和单片机只有一点点关系
函数调用时,形参自动分配内存,新建一个变量存储传递过来的实际参数的值,会自动完成数据类型的转换,函数结束自动回收
局部变量是自动变量,作用在块语句自动回收
全局变量,不属于任何一个函数,可以被任意函数调用,创建全局变量比main函数早,全局变量的生存周期是程序的生命期,全局变量会一直占内存,而局部变量用完就扔了
全局变量容易和局部变量重名,很容易被屏蔽失效,在外挂等安全方面值容易被修改
避免占内存较大的变量使用全局变量,节约内存,避免全局变量被错误修改,正规的软件工程,写一个函数要修改全局变量,一定要注释,为什么修改。修改的目的是什么。修改的值是多少
同名的情况下局部变量会屏蔽全局变量 C++可以用::访问全局变量,C语言不可以
换一个角度学习STM32就是对函数库的学习,再换一个角度就是学习C语言的第三方函数,和单片机只有一点点关系
主要还是C语言的STM32库的学习
函数名的本质是内存代码地址
形参变量名可以省略
函数参数的传递过程是从右往左
递归无限循环容易堆栈溢出,函数返回值有副本机制,在返回的时候,另外保存一份, 原来内存或者寄存器的数据就被销毁了,数组没有副本机制
函数的递归调用--->>>>>函数自己调用自己 和goto很像,需要结束条件
简单的递归
void dosh( int num )
{
if(num)
return;
else
{
printf("heloo C");
dosh(num - 1);
}
}
函数调用时,形参自动分配内存,新建一个变量存储传递过来的实际参数的值,会自动完成数据类型的转换,函数结束自动回收
局部变量是自动变量,作用在块语句自动回收
全局变量,不属于任何一个函数,可以被任意函数调用,创建全局变量比main函数早,全局变量的生存周期是程序的生命期,全局变量会一直占内存,而局部变量用完就扔了
全局变量容易和局部变量重名,很容易被屏蔽失效,在外挂等安全方面值容易被修改
避免占内存较大的变量使用全局变量,节约内存,避免全局变量被错误修改,正规的软件工程,写一个函数要修改全局变量,一定要注释,为什么修改。修改的目的是什么。修改的值是多少
同名的情况下局部变量会屏蔽全局变量 C++可以用::访问全局变量,C语言不可以
一个局部变量的作用域包含它的块语句内部,块语句内部变量屏蔽外部变量
有30个台阶,一次可以走一步或者两步,总共有多少种走法 递归调用
//有30个台阶,一次可以走一步或者两步,总共有多少种走法 递归调用
#include<stdio.h>
#include<stdlib.h>
double tencent(int n)
{
if (n == 1)
{
return 1.0;
}
else if (n == 2)
{
return 2.0;
}
else
{
return tencent(n - 1) + tencent(n - 2);
}
}
int main()
{
printf("%llf\n", tencent(30));
system("pause");
}
输入十进制,转换成二进制
#include<stdio.h>
#include<stdlib.h>
//输入十进制,转换成二进制
void change(int num)
{
if (num == 0)
{
return;
}
else
{
change(num / 2);
printf("%d",num%2);
}
}
int mainB()
{
int num;
printf("输入的十进制为\n");
scanf("%d",&num);
printf("输出的二进制为\n");
change(num);
system("pause");
}
用递归函数计算累加值
#include <stdio.h>
#include <stdlib.h>
//用递归函数计算累加值
int add_100(int num)
{
if (num == 0)
{
return 0;
}
else
{
return num + add_100(num - 1); //递归运算
}
}
int main()
{
printf("%d\n",add_100(5) );
system("pause");
}