嵌入式c学习第十天
malloc函数与calloc函数区别
1、参数:malloc只有一个参数,calloc有两个参数
2、堆内存里的数据:malloc申请的堆内存数据未初始化,calloc申请的堆内存数据已初始化
const常量关键字:英文constant的缩写,表示常量。在c语言中一般用于修饰变量,可以降低变量的访问权限,把变量变成只读如:
int a = 10;//变量a是可以可读可写的,const int b = 20 //变量b是只读变量
利用变量来存储一个常量,需要在定义的时候用const关键字修饰,且必须要完成初始化!
const 修饰指针变量
int * const p:指针常量,const直接修饰指针变量p,表示p的值不能改变,即p指向的地址不能改变
const int *p == int const * p:常量指针,const修饰指针p所指向的地址,表示此地址下的此数据只有在使用*p间接访问时才不能修改
const int *const p:表示指针变量p的值不能改变,且p所指向的地址下面的数据在使用*p访问时也不能改变
递归函数:
1、设计递归函数求1*2*3*.....n;
#include <stdio.h>
int mul(int n)
{
//结束条件
if(1 == n){
return n;
}
//调用自身
return mul(n-1) * n;
}
int main()
{
int n =5;
printf("1-%d的积为:%d\n", n, mul(n));
return 0;
}
2、输入字符串,使用递归函数实现字符串逆序输出
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool osr(char *p)
{
//结束条件
if('\0' == *p){
return false;
}
//调用自身
osr(p+1);
printf("%c", *p);
}
int main()
{
//定义指针变量指向NULL
char *p = NULL;
//通过calloc申请堆内存,用指针变量接收返回的堆内存的首地址,用于存储用户输入的字符串
p = (char *)calloc(1,100);
//确认申请堆内存是否成功,错误处理
if(NULL == p){
perror("堆内存申请异常");
return -1; //程序异常退出
}
//提示用户输入字符串,接收字符串
printf("please input string:");
scanf("%s", p);
//调用递归函数
osr(p);
//使用完成释放堆内存,同时让指针再次指向NULL
free(p);
p = NULL;
return 0;
}
3、通过scanf输入字符串,计算字符串的实际长度
#include <stdio.h>
#include <stdlib.h>
int stl(char *p)
{
//结束条件
if('\0' == *p){
return 0;
}
//调用自身
return stl(p+1) + 1;
}
int main()
{
//定义指针变量指向NULL
char *p = NULL;
//通过calloc申请堆内存,用指针变量接收返回的堆内存的首地址,用于存储用户输入的字符串
p = (char *)calloc(1,100);
//确认申请堆内存是否成功,错误处理
if(NULL == p){
perror("堆内存申请异常");
return -1; //程序异常退出
}
//提示用户输入字符串,接收字符串
printf("please input string:");
scanf("%s", p);
//调用递归函数
printf("长度为:%d\n", stl(p));
//使用完成释放堆内存,同时让指针再次指向NULL
free(p);
p = NULL;
return 0;
}
4、费波拿契数
#include <stdio.h>
#include <stdlib.h>
int fibnum(int n)
{
if(0 == n || 1 == n){
return n;
}
return fibnum(n-1) + fibnum(n-2);
}
int main()
{
int n=0;
while(1){
printf("请输入是第几个数:");
scanf("%d", &n);
printf("第%d个费波拿契数是%d\n", n, fibnum(n));
}
return 0;
}