前言
记录嵌入式学习过程,持续更新。。。
递归函数
一个函数直接或间接的调用自己就称为递归函数。
注意事项
递归函数缺点:
(1)占用栈区空间大,容易造成死循环;
(2)直到栈区空间不足,程序崩溃发生段错误结束。
注意事项:
一定要有递归结束条件(出口)。
案例
用递归函数,求1+2+3+...+100的和。
#include <stdio.h>
int getSum(int num)
{
if(num == 1)
{
return 1;
}
int res = getSum(num-1)+num;
return res;
}
int main()
{
int res = getSum(100);
printf("res is %d\n",res);
return 0;
}
练习
1.计算一个正整数的幂,即实现函数fun(base,exponent),该函数返回base的exponent次幂。
#include <stdio.h>
long fun(int base,int e)
{
if(e == 0) //递归 程序结束出口 任何数的0次幂都是1
return 1;
return fun(base,e-1)*base;
}
int main()
{
long ret = fun(2,10);
printf("ret is %ld\n",ret);
return 0;
}
2.使用递归函数实现斐波那契数列,打印输出前20项,先正序,后逆序。(斐波那契数列前两项的值是1,从第三项开始任意一项的值都是前两项之和。)
#include <stdio.h>
int feibo(int n)
{
if(n == 1 || n == 2) //前两项的值为1 (递归结束条件)
return 1;
return feibo(n-1)+feibo(n-2); //从第三项开始 前两项之和
}
int main()
{
printf("-----正序------\n");
int i;
for(i = 1;i <= 20;i++)
{
printf("%d ",feibo(i));
}
printf("\n");
printf("-----逆序------\n");
for(i = 20;i >= 1;i--)
{
printf("%d ",feibo(i));
}
printf("\n");
return 0;
}
二级指针
指向指针的指针,指针存地址,二级指针存的是一级指针的地址。
对一级指针取地址就变成二级
定义
int a = 10;
int *p = &a; //占4字节
int **q = &p; //对一级指针取地址变成二级指针 占4字节
用途1
通过二级指针,能够在函数内部修改一级指针存放的内容。(在动态内存分配和链表中常见)
用途2
用于传递指针数组时,见下面例子
#include <stdio.h>
#include <string.h>
//遍历数组
void showName(char **p,int n)
{
int i;
for(i = 0;i < n;i++)
{
printf("%s ",p[i]);
}
printf("\n");
}
//对数组进行冒泡排序
void sortName(char **p,int n)
{
int i,j;
for(i = 0;i < n-1;i++)
{
for(j = 0;j < n-1-i;j++)
{
if(strcmp(p[j],p[j+1]) > 0)
{
char *temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
}
}
int main()
{
char* name[5] = {"aa","dd","cc","ee","bb"};
showName(name,5);
sortName(name,5);
showName(name,5);
return 0;
}
malloc函数
动态内存分配,在堆区分配连续的内存空间
int *p = (int *)malloc(10*sizeof(int)); //在堆区开辟
if(p == NULL)
{
printf("malloc failed\n");
return -1;
}
malloc函数的原型 void *malloc(size_t size);
(1)返回值类型为void* 可以通过强制转换为其他类型指针
(2)空间申请成功返回首地址,失败返回NULL
(3)头文件 #include <stdlib.h>
malloc函数使用的注意事项:内存泄露
(1)malloc和free一定要成对使用;
(2)堆区申请的内存必须手动释放;
(3)必须加条件判断
指针函数
返回值类型是指针的函数,就称为指针函数。
返回值的类型:int* void* char* 等等
作用:调用这类函数能返回一个地址
举例
void* malloc(int size);
char *strcpy(char *dest, const char *src);
踩坑
踩坑一:strcmp函数的返回值问题
问题
解决
strcmp函数的返回值
- 小于 0:表示第一个字符串小于第二个字符串。
- 等于 0:表示两个字符串相等。
- 大于 0:表示第一个字符串大于第二个字符串。